@ConfigurationProperties молча пропускает поле без сеттера

Классический биндинг конфигурации через Binder работает только с теми свойствами, у которых есть доступный сеттер или изменяемое поле. Если поле объявлено без сеттера, Spring не бросает исключение и не пишет warning — он просто не биндит это значение, оставляя дефолт из кода.

@ConfigurationProperties(prefix = "app.retry") public class RetryProperties { private int maxAttempts = 3; private long backoffMs = 100;

public int getMaxAttempts() { return maxAttempts; }

public void setMaxAttempts(int v) { this.maxAttempts = v; }

// backoffMs без сеттера — // всегда останется 100 }

В application.yml стоит app.retry.backoff-ms: 500, тесты на старте зелёные, приложение поднялось без единой строчки в логе про эту проблему. Значение 500 нигде не появляется — код продолжает ретраить с интервалом 100мс.

Спросят следом: как заставить Spring падать при таком несоответствии. Ответ — @ConstructorBinding с all-args конструктором или record: каждое поле обязано прийти через конструктор, а не через сеттер, и опечатка в типе или отсутствующий параметр ловится на старте контекста.

Проверка биндинга конфигурации по логам старта ничего не скажет — нужно логировать сами значения после инициализации бина.

Тренажёр: 600 вопросов, мок с таймером, план повторов

senior·base — что спрашивают на самом деле


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