Наш REST API получает входные данные некоторых объектов JSON, где некоторые поля должны быть не нулевыми. Это может быть либо String/Integer, либо даже другой экземпляр класса в качестве ссылки.
Мы пытаемся найти способ заставить эти поля быть не нулевыми вместо правильного способа проверки на ноль в API. Текущий:
if (myObject.getSomeOtherObject() == null)
throw new SomeException();
То, что мы хотим иметь, это что-то вроде:
class MyObject{
@Required
OtherObject someOtherObject;
// ...
}
Мы попробовали 3 вещи:
1) Обновление до версии Jackson 2.0.6 и использование аннотации com.fasterxml.jackson.annotation.JsonProperty. Но это выглядит неработающим. Нашли эти ссылки: http://jira.codehaus.org/browse/JACKSON-767
2) Расширение JsonDeserializer для проверки на ноль, но проблема в том, что он даже не выполняется на нулевом вводе.
public class NotNullDeserializer<T> extends JsonDeserializer<T> {
@Override
public T deserialize(JsonParser jsonparser, DeserializationContext deserializationcontext) throws IOException, JsonProcessingException {
ParameterizedType superClass = (ParameterizedType) getClass().getGenericSuperclass();
Class<T> type = (Class<T>) 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;
3) Написание собственной аннотации @Required
и попытка проверки с помощью ResourceFilter, но, похоже, я не могу получить реальный объект из ContainerRequest, и даже если бы мы могли, не уверен, как выполнить глубокую проверку нулевой ссылки в object.otherObject.someObject.fieldNotNullable
private class Filter implements ResourceFilter, ContainerRequestFilter {
private final ArrayList<String> requiredParameters;
protected Filter() {
requiredParameters = null;
}
protected Filter(ArrayList<String> 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<String, String> params = request.getQueryParameters();
params.putAll(request.getFormParameters());
StringBuffer missingParams = new StringBuffer();
for (String reqParam : requiredParameters) {
List<String> 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;
}
}