int-поле в DTO: отсутствующий JSON-ключ становится 0, а не null
Jackson десериализует JSON в DTO по правилам Java, а не JSON. Если поле объявлено как int и в присланном JSON этого ключа вообще нет, Jackson не кидает ошибку - примитив просто остаётся со значением по умолчанию, то есть 0.
Разница с Integer критична для бизнес-логики: null значит «клиент не передал», 0 значит «клиент передал ноль». Если поле quantity объявлено int и валидация проверяет только quantity > 0, отсутствие поля в запросе тихо пройдёт как невалидное значение без единого исключения на этапе парсинга.
Похожая ловушка с boolean: отсутствующий флаг становится false, а не «неизвестно». Отличить «клиент не передал» от «клиент передал false» можно только оберткой в Boolean.
public class OrderRequest { private int quantity; private Boolean expedited; }
Что спросят следом: как заставить Jackson упасть на отсутствующем обязательном поле? Ответ - @JsonProperty(required = true) вместе с DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, либо явная валидация после парсинга, потому что required у Jackson работает только для явно отсутствующего ключа, а не для его null-значения.
Финал: примитив в DTO - это про производительность, не про совместимость с отсутствующими полями.
Тренажёр: 600 вопросов, мок с таймером, план повторов
senior·base — что спрашивают на самом деле
В этом посте были ссылки, но мы их удалили по правилам Сетки