Ваш подход ставит две важные проблемы:
1) Ваш способ проверки в конкретном установщике не согласован, потому что вы не знаете, в каких порядках поля будут установлены Джексоном в процессе десериализации (JSON для объекта Java). Таким образом, поле может быть null
, потому что оно еще не было инициализировано. Таким образом, проверка может быть непоследовательной .
2) Джексон оптимизирован для установки поля с установщиком во время десериализации, только если значение присутствует. Он анализирует JSON и десериализует обнаруженный токен, не больше, не меньше.
Таким образом, если значение является пустым в JSON, установщик никогда не будет вызываться для объекта Java.
Информация не легко найти, но это здесь:
com.fasterxml.jackson.databind.deser.BeanDeserializer
:
@Override
public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException
{
// common case first
if (p.isExpectedStartObjectToken()) {
if (_vanillaProcessing) {
return vanillaDeserialize(p, ctxt, p.nextToken());
}
// 23-Sep-2015, tatu: This is wrong at some many levels, but for now... it is
// what it is, including "expected behavior".
p.nextToken();
if (_objectIdReader != null) {
return deserializeWithObjectId(p, ctxt);
}
return deserializeFromObject(p, ctxt);
}
return _deserializeOther(p, ctxt, p.getCurrentToken());
}
Здесь p.nextToken();
возвращает следующий токен для десериализации в соответствии с полученным JSON.
JSONParser.nextToken()
определяется как:
Основной метод итерации, который будет продвигать поток достаточно для определения
тип следующего токена, если есть. Если ничего не осталось (поток не имеет
содержимое, отличное от возможного пробела перед окончанием), будет нулевым
вернулся.
Короче говоря, вы должны использовать API или способ, разработанный для проверки модели, а не пытаться выполнить логику проверки внутри сеттеров, что является неправильным подходом.
Некоторые опции:
1) API проверки бинов . Это может быть полезно: http://hibernate.org/validator/documentation/getting-started/.
Это очень хорошо для ограничений аннотаций на полях.
2) Для структурированных проверок, как в вашем коде: проверки, которые отличаются по некоторым правилам, вы не можете полагаться на ограничения аннотаций для полей.
Поэтому либо создайте функции проверки, либо, в качестве альтернативы, вы можете включить проверку логики в конструктор класса. Это возможно, если вы аннотируете конструктор с помощью @JsonCreator
.