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 — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки