Aplicar campo no nulo en objeto JSON
Nuestra API REST recibe una entrada de algunos objetos JSON donde se requiere que algunos campos no sean nulos. Esos pueden ser String / Integer o incluso pueden ser otra instancia de clase como referencia.
Estamos tratando de encontrar una manera de hacer que esos campos no sean nulos, en lugar de la forma correcta de verificación nula en la api. Corriente:
if (myObject.getSomeOtherObject() == null) throw new SomeException();
Lo que queremos tener es algo como:
class MyObject{ @Required OtherObject someOtherObject; ... }
Hemos intentado 3 cosas:
Actualice a jackson 2.0.6 y use la anotación com.fasterxml.jackson.annotation.JsonProperty. Pero esto parece que no funciona. Encontré esas referencias:http://jira.codehaus.org/browse/JACKSON-767
Extender JsonDeserializer para verificar nulo pero el problema es que ni siquiera se ejecuta en la entrada nula.
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;Escribimos nuestra propia anotación @Required e intentamos verificar con ResourceFilter, pero parece que no puedo obtener el objeto real de ContainerRequest e incluso si pudiéramos, no estamos seguros de cómo ejecutar una comprobación profunda de la referencia nula en 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; } }
Cualquier ayuda e ideas apreciadas.