Nicht-Null-Feld im JSON-Objekt erzwingen

Unsere REST-API empfängt einige JSON-Objekte, bei denen einige Felder nicht null sein müssen. Dies kann entweder String / Integer sein oder auch eine andere Klasseninstanz als Referenz.

Wir versuchen, eine Möglichkeit zu finden, diese Felder nicht auf Null zu setzen, sondern auf die entsprechende Weise, um die API auf Null zu prüfen. Aktuell:

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

Was wir haben wollen, ist so etwas wie:

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

Wir haben 3 Dinge ausprobiert:

Aktualisieren Sie auf jackson 2.0.6 und verwenden Sie die Anmerkung com.fasterxml.jackson.annotation.JsonProperty. Gefunden diese Referenzen:http://jira.codehaus.org/browse/JACKSON-767

JsonDeserializer wird erweitert, um null zu überprüfen. Das Problem ist jedoch, dass es nicht einmal für die null-Eingabe ausgeführt wird.

    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;

Schreiben Sie unsere eigene @Required-Annotation und versuchen Sie, mit ResourceFilter zu prüfen, aber anscheinend kann ich das tatsächliche Objekt nicht aus dem ContainerRequest abrufen, und selbst wenn dies nicht möglich ist, können wir nicht sicher sein, wie eine gründliche Prüfung der Nullreferenz in object.otherObject.someObject.fieldNotNullable ausgeführt wird
    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;
        }
    }


Jede Hilfe und Erkenntnisse geschätzt.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage