2012-10-10 19 views
15

Nasz interfejs API REST otrzymuje niektóre obiekty JSON, których pola są wymagane, aby nie były puste. Mogą to być ciągi/liczby całkowite lub nawet inne instancje klasy jako odniesienia.Wymuszenie pola niepustego w obiekcie JSON

Staramy się znaleźć sposób na wymuszenie tego pola, aby nie było wartością zerową, a nie metodą Corrent dla zerowego sprawdzania w interfejsie API. prądu:

 

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

Co chcemy mieć to coś w rodzaju:

 

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

Próbowaliśmy 3 rzeczy:

  • Upgrade Jackson 2.0.6 i używać adnotacji com .fasterxml.jackson.annotation.JsonProperty Ale wygląda na to, że nie działa. Znaleziono te referencje: http://jira.codehaus.org/browse/JACKSON-767

  • Rozszerzanie JsonDeserializer sprawdzić wartość null, ale problemem jest to, że nawet nie wykonywane na wejściu zerowej.

 

    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; 

  • Pisząc własne @Required adnotacji i próbuje skontaktować się z ResourceFilter, ale wydaje się, że nie można uzyskać rzeczywisty obiekt z ContainerRequest a nawet gdyby się dało, nie wiem, jak wykonać głęboki czek null odniesienia w 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; 
     } 
    } 


Każda pomoc i spostrzeżenia mile widziane.

Odpowiedz

16

JAX-RS oddziela całkiem przyjemnie się deserializacji z walidacji, czyli Jackson ma według projektu brak mechanizmu wymuszania wartości jako non-null itd. Zamiast tego można użyć opcji BeanValidation dla t kapelusz:

  1. Dodaj zależność do zakresu javax.validation:validation-api w zakresie provided.
  2. Dodaj adnotację javax.validation.constraints.NotNull do swojego pola.

Aby uzyskać więcej informacji, przejdź na stronę here.

+0

Chociaż to stare pytanie, odpowiedź wygląda dobrze :) Dzięki! Przyjęty. – urir

+1

literówka w nazwie pakietu: ograniczenia – Bax

1

@Required to wiosenna adnotacja ramowa dla wstrzykiwanych fasoli, więc powiedziałbym, że nie należy jej używać do tego celu.

tej można użyć jednego Zamiast:

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

@NotNull String myString;

Dla kontroli uruchomieniowych, spróbuj http://code.google.com/p/notnullcheckweaver/

+0

'@ required' I odwołuje był nasz własny adnotacja. W każdym razie, dziękuję i spróbuję twojej porady teraz, właśnie - który jar potrzebuję dla 'core.validation. *' Import? – urir

+0

Adnotacja w łączu dotyczy "tej adnotacji, która ma być używana przez narzędzia do analizy statycznej". Ale potrzebuję tego do ścisłego sprawdzania poprawności interfejsu API w środowisku wykonawczym. Dzięki :) – urir

+0

zobacz moją edycję powyżej. –