Nasz interfejs API REST otrzymuje niektóre obiekty JSON, których pola są wymagane, aby nie były puste. Mogą to być ciągi/liczby całkowite lub nawet inne instancje klasy jako odniesienia.Wymuszenie pola niepustego w obiekcie JSON
Staramy się znaleźć sposób na wymuszenie tego pola, aby nie było wartością zerową, a nie metodą Corrent dla zerowego sprawdzania w interfejsie API. prądu:
if (myObject.getSomeOtherObject() == null) throw new SomeException();
Co chcemy mieć to coś w rodzaju:
class MyObject{ @Required OtherObject someOtherObject; ... }
Próbowaliśmy 3 rzeczy:
Upgrade Jackson 2.0.6 i używać adnotacji com .fasterxml.jackson.annotation.JsonProperty Ale wygląda na to, że nie działa. Znaleziono te referencje: http://jira.codehaus.org/browse/JACKSON-767
Rozszerzanie JsonDeserializer sprawdzić wartość null, ale problemem jest to, że nawet nie wykonywane na wejściu zerowej.
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 własne @Required adnotacji i próbuje skontaktować się z ResourceFilter, ale wydaje się, że nie można uzyskać rzeczywisty obiekt z ContainerRequest a nawet gdyby się dało, nie wiem, jak wykonać głęboki czek null odniesienia 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 mile widziane.
Chociaż to stare pytanie, odpowiedź wygląda dobrze :) Dzięki! Przyjęty. – urir
literówka w nazwie pakietu: ograniczenia – Bax