Wymuszaj nie-puste pole w obiekcie JSON
Nasz interfejs API REST odbiera dane wejściowe obiektów JSON, w których niektóre pola muszą być puste. Mogą to być ciągi / liczby całkowite lub nawet inne klasy jako referencje.
Próbujemy znaleźć sposób na wymuszenie, aby te pola nie były puste, zamiast zwykłego sposobu sprawdzania zerowego api. Obecny:
if (myObject.getSomeOtherObject() == null) throw new SomeException();
Chcemy mieć coś w stylu:
class MyObject{ @Required OtherObject someOtherObject; ... }
Próbowaliśmy 3 rzeczy:
Uaktualnij do jackson 2.0.6 i użyj adnotacji com.fasterxml.jackson.annotation.JsonProperty Ale to po prostu nie działa. Znaleziono te odniesienia:http://jira.codehaus.org/browse/JACKSON-767
Rozszerzenie JsonDeserializer, aby sprawdzić wartość null, ale problem polega na tym, że nawet nie jest wykonywany na wejściu zerowym.
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;Pisząc naszą własną adnotację @Required i próbując sprawdzić za pomocą ResourceFilter, ale wygląda na to, że nie mogę pobrać rzeczywistego obiektu z ContainerRequest i nawet jeśli możemy, nie wiemy, jak wykonać głębokie sprawdzenie pustego odwołania w 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; } }
Każda pomoc i spostrzeżenia doceniane.