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

Schreibe einen Kommentar