Wymuszaj nie-puste pole w obiekcie JSON

Nasz interfejs API REST odbiera dane wejściowe obiektów JSON, w których niektóre pola muszą być puste. Mogą to być ciągi / liczby całkowite lub nawet inne klasy jako referencje.

Próbujemy znaleźć sposób na wymuszenie, aby te pola nie były puste, zamiast zwykłego sposobu sprawdzania zerowego api. Obecny:

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

Chcemy mieć coś w stylu:

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

Próbowaliśmy 3 rzeczy:

Uaktualnij do jackson 2.0.6 i użyj adnotacji com.fasterxml.jackson.annotation.JsonProperty Ale to po prostu nie działa. Znaleziono te odniesienia:http://jira.codehaus.org/browse/JACKSON-767

Rozszerzenie JsonDeserializer, aby sprawdzić wartość null, ale problem polega na tym, że nawet nie jest wykonywany na wejściu zerowym.

    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 naszą własną adnotację @Required i próbując sprawdzić za pomocą ResourceFilter, ale wygląda na to, że nie mogę pobrać rzeczywistego obiektu z ContainerRequest i nawet jeśli możemy, nie wiemy, jak wykonać głębokie sprawdzenie pustego odwołania 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 doceniane.

questionAnswers(4)

yourAnswerToTheQuestion