Erzwinge Nicht-Null-Feld im JSON-Objekt
Unserer REST-API erhält-einige JSON-Objekte Eingang, wo einige Felder nicht null. Diese können entweder String/Integer oder auch vielleicht, einige andere Klasse-Instanz als Referenz.
Wir versuchen einen Weg zu finden, diese durchzusetzen Feld nicht null ist, statt des corrent Weg zur null-check in der api.
Strom:
if (myObject.getSomeOtherObject() == null) throw new SomeException();
Was wir haben wollen ist sowas wie:
class MyObject{ @Erforderlich OtherObject someOtherObject; ... }
Wir haben versucht 3 Dinge:
- Upgrade zu jackson 2.0.6 und Anmerkung verwenden
com.fasterxml.jackson.Anmerkung.JsonProperty
Aber das sieht einfach nicht funktioniert.
Fand diese Verweise:
http://jira.codehaus.org/browse/JACKSON-767 - Erweitern JsonDeserializer zu überprüfen, null aber das problem ist, dass es nicht auch ausgeführt auf der null-Eingang.
public class NotNullDeserializer<T> erweitert JsonDeserializer<T> { @Override public T Deserialisieren(JsonParser jsonparser, DeserializationContext deserializationcontext) throws IOException, JsonProcessingException { ParameterizedType superClass = (ParameterizedType) getClass().getGenericSuperclass(); Klasse type = (Class) Oberklasse.getActualTypeArguments()[0]; T t = jsonparser.readValueAs(Typ); if (t == null){ String classNameField = Typ.getName(); String Feld = jsonparser.getCurrentName(); throw new WrongInputException("Das Feld '"+Feld+"' type '"+classNameField+"' sollte nicht null sein."); } return t; } } public class NotNullAddressDeserializer erstreckt NotNullDeserializer<Adresse> { } @JsonDeserialize(using=NotNullAddressDeserializer.class) Adresse;
- Schreiben unsere eigene @Required-annotation und versuchen, überprüfen Sie mit ResourceFilter, aber es scheint, ich kann nicht das eigentliche Objekt aus dem ContainerRequest und selbst wenn wir könnten, nicht sicher, wie Sie Sie ausführen tief überprüfen der null-Referenz im Objekt.otherObject.someObject.fieldNotNullable
private class Filter implements ResourceFilter, ContainerRequestFilter { private final ArrayList requiredParameters; geschützt Filter() { requiredParameters = null; } geschützt Filter(ArrayList requiredParameters) { diese.requiredParameters = requiredParameters; } @Override öffentliche ContainerRequestFilter getRequestFilter() { zurück dies; } @Override öffentliche ContainerResponseFilter getResponseFilter() { return null; } @Override öffentliche ContainerRequest filter(ContainerRequest Anfrage) { wenn (requiredParameters != null && requiredParameters.size() > 0) { MultivaluedMap params = request.getQueryParameters(); params.putAll(request.getFormParameters()); StringBuffer missingParams = new StringBuffer(); für (String reqParam : requiredParameters) { Liste paramValues = params.bekommen(reqParam); wenn (paramValues == null || paramValues != null && paramValues.size() == 0) missingParams.append(reqParam + ","); } wenn (missingParams.length() > 0) throw new WrongInputException("Erforderlicher Parameter fehlt:" + missingParams); } return Anfrage; } }
Jede Hilfe und Einblicke schätzen.
InformationsquelleAutor der Frage urir | 2012-10-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
JAX-RS trennt sehr schön die Deserialisierung aus der Validierung, D. H. Jackson hat von design keinen Mechanismus zur Durchsetzung der Werte
non-null
usw. Stattdessen können Sie mit BeanValidation:javax.validation:validation-api
improvided
Umfang.javax.validation.constraints.NotNull
Anmerkung zu Ihrem Feld.Für mehr details, gehen Sie hier.
InformationsquelleAutor der Antwort rü-
Können Sie JSON-SCHEMA, wie Sie Ausdrücken können, viele Einschränkungen auf JSON-Felder: http://json-schema.org/
Dann können Sie generieren aus dem schema Ihrer java-Klassen mit @NotNull JSR-303-Annotationen und die Verwendung bean validation auf Ihr Objekt. Es arbeitet mit Jackson nativ, so sollten Sie kein problem haben.
Zum Beispiel, können Sie die maven-plugin zu tun: http://wiki.jsonschema2pojo.googlecode.com/git/site/0.3.7/generate-mojo.html
InformationsquelleAutor der Antwort zenbeni
@Required
ist eine Spring-framework-Anmerkung für die injizierten beans, also würde ich sagen, dass Sie nicht verwenden es für diesen Zweck.Verwenden Sie dieses anstatt:
http://robaustin.wikidot.com/annotations-and-notnull
@NotNull
String myString;
Zur Laufzeit überprüft, versuchen http://code.google.com/p/notnullcheckweaver/
InformationsquelleAutor der Antwort Adam Adamaszek