2012-10-10 19 views
15

में गैर-शून्य फ़ील्ड को लागू करें हमारे आरईएसटी एपीआई कुछ JSON ऑब्जेक्ट इनपुट प्राप्त करता है जहां कुछ फ़ील्ड को शून्य नहीं होना चाहिए। वे या तो स्ट्रिंग/इंटीजर हो सकते हैं या संदर्भ के रूप में कुछ अन्य वर्ग उदाहरण भी हो सकते हैं।JSON ऑब्जेक्ट

हम उन क्षेत्रों को लागू करने के लिए एक तरीका खोजने की कोशिश कर रहे हैं, जो कि एपीआई में शून्य जांच के लिए सक्षम तरीका है। वर्तमान:

 

    class MyObject{ 
    @Required 
    OtherObject someOtherObject; 
    ... 
    } 

हम 3 चीजों की कोशिश की है:

 

    if (myObject.getSomeOtherObject() == null) 
    throw new SomeException(); 

कुछ की तरह क्या हम करना चाहते है

  • अपग्रेड जैक्सन 2.0.6 करने के लिए और एनोटेशन का उपयोग कॉम .fasterxml.jackson.annotation.JsonProperty लेकिन, यह सिर्फ काम नहीं कर रहा है। पाए जाने वाले संदर्भ: http://jira.codehaus.org/browse/JACKSON-767

  • JsonDeserializer विस्तार अशक्त जाँच करने के लिए है, लेकिन समस्या यह है कि यह और भी अशक्त इनपुट पर निष्पादित नहीं करता है।

 

    public class NotNullDeserializer<T> extends JsonDeserializer<T> { 

     @Override 
     public T deserialize(JsonParser jsonparser, DeserializationContext deserializationcontext) throws IOException, JsonProcessingException { 

      ParameterizedType superClass = (ParameterizedType) getClass().getGenericSuperclass(); 
      Class type = (Class) superClass.getActualTypeArguments()[0]; 

      T t = jsonparser.readValueAs(type); 

      if (t == null){ 
       String classNameField = type.getName(); 
       String field = jsonparser.getCurrentName(); 
       throw new WrongInputException("The field '"+field+"' of type '"+classNameField+"' should not be null."); 
      } 

      return t; 
     } 

    } 

    public class NotNullAddressDeserializer extends NotNullDeserializer<Address> { 

    } 

    @JsonDeserialize(using=NotNullAddressDeserializer.class) 
     Address to; 

  • हमारे अपने @Required एनोटेशन लेखन और ResourceFilter के साथ जांच करने की कोशिश कर, लेकिन यह मैं नहीं, ContainerRequest से वास्तविक वस्तु प्राप्त कर सकते हैं और यहां तक ​​कि हम कर सकते थे अगर यकीन है कि गहरी जांच निष्पादित करने के लिए कैसे नहीं लगता है object.otherObject.someObject.fieldNotNullable
  • में
 

    private class Filter implements ResourceFilter, ContainerRequestFilter { 

     private final ArrayList requiredParameters; 

     protected Filter() { 
      requiredParameters = null; 
     } 

     protected Filter(ArrayList requiredParameters) { 
      this.requiredParameters = requiredParameters; 
     } 

     @Override 
     public ContainerRequestFilter getRequestFilter() { 
      return this; 
     } 

     @Override 
     public ContainerResponseFilter getResponseFilter() { 
      return null; 
     } 


     @Override 
     public ContainerRequest filter(ContainerRequest request) { 
      if (requiredParameters != null && requiredParameters.size() > 0) { 
       MultivaluedMap params = request.getQueryParameters(); 
       params.putAll(request.getFormParameters()); 
       StringBuffer missingParams = new StringBuffer(); 
       for (String reqParam : requiredParameters) { 
        List paramValues = params.get(reqParam); 
        if (paramValues == null || paramValues != null && paramValues.size() == 0) 
         missingParams.append(reqParam + ","); 
       } 
       if (missingParams.length() > 0) 
        throw new WrongInputException("Required parameters are missing: " + missingParams); 
      } 
      return request; 
     } 
    } 


किसी भी मदद की और अंतर्दृष्टि की अशक्त संदर्भ की सराहना की।

उत्तर

16

JAX-आरएस कोशिश मान्यता से काफी अच्छी तरह से अक्रमांकन अलग करती है, यानी जैक्सन है डिज़ाइन द्वाराnon-null आदि मानों को लागू करने के लिए कोई तंत्र नहीं है, इसके बजाय, आप टी के लिए बीनवालिडेशन का उपयोग कर सकते हैं टोपी:

  1. provided दायरे में javax.validation:validation-api करने के लिए एक निर्भरता जोड़ें।
  2. javax.validation.constraints.NotNull अपने क्षेत्र में एनोटेशन जोड़ें।

अधिक जानकारी के लिए, here पर जाएं।

+0

हालांकि यह पुराना सवाल है, जवाब अच्छा दिखता है :) धन्यवाद! स्वीकार किए जाते हैं। पैकेज नाम में – urir

+1

टाइपो: बाधाएं – Bax

1

@Required इंजेक्शन बीन्स के लिए एक स्प्रिंग फ्रेमवर्क एनोटेशन है, इसलिए मैं कहूंगा कि इस उद्देश्य के लिए इसका उपयोग न करें।

आप के बजाय इस एक का उपयोग कर सकते हैं:

http://robaustin.wikidot.com/annotations-and-notnull

@NotNull String myString;

क्रम चेकों के लिए, http://code.google.com/p/notnullcheckweaver/

+0

'@ Required' मैं संदर्भित हमारे अपने एनोटेशन था। वैसे भी, धन्यवाद और मैं अब आपकी सलाह का प्रयास करूंगा, बस - मुझे कौन सा जार 'कोर.विडिएशन' * आयात के लिए चाहिए? – urir

+0

लिंक में एनोटेशन 'इस एनोटेशन का उद्देश्य स्थिर विश्लेषण उपकरण' द्वारा उपयोग किया जाना है। लेकिन मुझे रनटाइम में सख्त एपीआई सत्यापन के लिए इसकी आवश्यकता है। धन्यवाद :) – urir

+0

ऊपर से मेरा संपादन देखें। –

2

आप JSON-SCHEMA उपयोग कर सकते हैं के रूप में आप JSON खेतों पर कई बाधाओं इसके साथ व्यक्त कर सकते हैं: अपने जावा वर्गों @NotNull JSR साथ 303 एनोटेशन http://json-schema.org/

तो फिर तुम स्कीमा से उत्पन्न कर सकते हैं और अपने वस्तु पर सेम सत्यापन का उपयोग । यह जैक्सन के साथ मूल रूप से काम करता है, इसलिए आपको कोई समस्या नहीं होनी चाहिए।

उदाहरण के लिए, यदि आप ऐसा करने Maven प्लगइन का उपयोग कर सकते हैं: http://wiki.jsonschema2pojo.googlecode.com/git/site/0.3.7/generate-mojo.html

संबंधित मुद्दे