Заполнить ненулевое поле в объекте JSON
Наш REST API получает входные данные некоторых объектов JSON, где некоторые поля должны быть не нулевыми. Это может быть либо String / Integer, либо даже другой экземпляр класса в качестве ссылки.
Мы пытаемся найти способ заставить эти поля быть не нулевыми вместо альтернативного способа проверки на нуль в API. Текущий:
if (myObject.getSomeOtherObject() == null) throw new SomeException();
То, что мы хотим иметь, это что-то вроде:
class MyObject{ @Required OtherObject someOtherObject; ... }
Мы попробовали 3 вещи:
Обновите систему до версии Jackson 2.0.6 и используйте аннотацию com.fasterxml.jackson.annotation.JsonProperty. Но это выглядит неработающим. Нашли эти ссылки:http://jira.codehaus.org/browse/JACKSON-767
Расширение JsonDeserializer для проверки нуля, но проблема в том, что он даже не выполняется на нулевом вводе.
public class NotNullDeserializer extends JsonDeserializer { @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 { } @JsonDeserialize(using=NotNullAddressDeserializer.class) Address to;Написание собственной аннотации @Required и попытка проверки с помощью ResourceFilter, но, похоже, я не могу получить реальный объект из ContainerRequest, и даже если бы мы могли, не уверен, как выполнить глубокую проверку нулевой ссылки в 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; } }
Любая помощь и понимание приветствуется.