Impor campo não nulo no objeto JSON
Nossa API REST recebe alguma entrada de objetos JSON, em que alguns campos não precisam ser nulos. Aqueles podem ser String / Integer ou até mesmo ser alguma outra instância de classe como referência.
Estamos tentando encontrar uma maneira de impor que esse campo não seja nulo, em vez do caminho correto para a verificação nula na API. Atual:
if (myObject.getSomeOtherObject() == null) throw new SomeException();
O que nós queremos é algo como:
class MyObject{ @Required OtherObject someOtherObject; ... }
Nós tentamos 3 coisas:
Atualize para o jackson 2.0.6 e use a anotação com.fasterxml.jackson.annotation.JsonProperty Mas isso parece não funcionar. Encontrei essas referências:http://jira.codehaus.org/browse/JACKSON-767
Estendendo o JsonDeserializer para verificar nulo, mas o problema é que ele nem sequer é executado na 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;Escrevendo nossa própria anotação @Required e tentando verificar com ResourceFilter, mas parece que não consigo obter o objeto real do ContainerRequest e mesmo que pudéssemos, não tenho certeza de como executar a verificação profunda da referência nula no objeto.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; } }
Qualquer ajuda e idéias apreciadas.