2012-10-10 11 views
15

REST API'mız, bazı alanların boş olmaması gereken bazı JSON nesneleri girdisini alır. Bunlar, Dize/Tamsayı olabilir veya referans olarak başka bir sınıf örneği olabilir.JSON nesnesinde null olmayan alanı zorla

Bu alanın boşta olup olmadığının api yerine null olması için bu alanı zorlama yöntemini bulmaya çalışıyoruz. Akım: Biz 3 şeyi denedi

 

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

: bir şey gibi

 

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

Elimizde istediğim

  • Yükseltme jackson 2.0.6 ve notu kullanın com .fasterxml.jackson.annotation.JsonProperty Ancak, bu sadece çalışmıyor. Bulunan bu referanslar: JsonDeserializer genişletme http://jira.codehaus.org/browse/JACKSON-767

  • boş kontrol etmek ama sorun bile boş girişe infaz olmamasıdır.

 

    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; 

  • kendi @Required ek açıklama yazma ve ResourceFilter ile kontrol etmeye çalışırken, ancak edebilsek bile ben, derin denetimi yürütmek için nasıl emin değil ContainerRequest gerçek nesneyi almak ve olamaz gibi görünüyor Herhangi bir yardım ve anlayış
 

    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; 
     } 
    } 


object.otherObject.someObject.fieldNotNullable içinde null başvuru takdir.

cevap

16

JAX-RS çalışma zamanı kontrolleri için

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

@NotNull String myString;

yani Jackson vardır, doğrulama oldukça güzel deserialization ayırır tasarımnon-null vb. Değerleri zorlamak için hiçbir mekanizma yok. Bunun yerine, t için BeanValidation'ı kullanabilirsiniz. hat:

  1. provided kapsamındaki javax.validation:validation-api bağımlılığı ekleyin.
  2. javax.validation.constraints.NotNull ek açıklamasını alanınıza ekleyin.

Ayrıntılar için, here adresine [email protected] JSR ile Sonra şemasından üretebilir 303 ek açıklamaları için java sınıfları http://json-schema.org/

ve nesne üzerinde fasulye doğrulama kullanın: onunla JSON alanlarda birçok kısıtlamaları ifade edebilen olarak

+0

Bu eski bir soru olmasına rağmen, cevap iyi görünüyor :) Teşekkürler! Kabul edilmiş. Paket adında – urir

+1

yazım hatası: kısıtlamalar – Bax

1

@Required enjekte edilen fasulyeler için bir yaylı çerçeve ek açıklamadır, bu yüzden bu amaçla kullanmayın derim.

Sen yerine bunu kullanabilirsiniz

: denemek, http://code.google.com/p/notnullcheckweaver/

+0

'kendi ek açıklama oldu. Neyse, teşekkürler ve şimdi tavsiyenizi deneyeceğim, sadece - core.validation için gerekli olan jar? – urir

+0

Bağlantıdaki ek açıklama, bu ek açıklamanın statik analiz araçları tarafından kullanılması içindir. Ancak, çalışma zamanında katı API doğrulaması için buna ihtiyacım var. Teşekkürler :) – urir

+0

o zaman yukarıda benim düzenlemeye bakın. –

İlgili konular