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.