Nuestra API REST recibe algunos objetos JSON de entrada, donde se requiere que algunos campos no sean nulos. Esos pueden ser String/Integer o incluso podría ser alguna otra instancia de clase como referencia.Aplicar el campo no nulo en el objeto JSON
Estamos tratando de encontrar una forma de hacer cumplir esos campos para que no sea nula, en lugar de la forma corrent para la verificación nula en la API. actual:
if (myObject.getSomeOtherObject() == null) throw new SomeException();
Lo que queremos es que algo como:
class MyObject{ @Required OtherObject someOtherObject; ... }
Hemos intentado 3 cosas:
actualiza a 2.0.6 Jackson y el uso de la anotación com .fasterxml.jackson.annotation.JsonProperty Pero esto simplemente no funciona. encontradas esas referencias: http://jira.codehaus.org/browse/JACKSON-767
Ampliación JsonDeserializer para comprobar nula, 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;
- escribir nuestra propia anotación @Required y tratando de comprobar con ResourceFilter, pero parece que no puedo conseguir el objeto real de la ContainerRequest e incluso si pudiéramos, no está seguro de cómo ejecutar cheque profunda de 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 y conocimientos apreciado.
Aunque esta es una vieja pregunta, la respuesta es buena :) ¡Gracias! Aceptado. – urir
error en el nombre del paquete: restricciones – Bax