@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 — что спрашивают на самом деле
В этом посте были ссылки, но мы их удалили по правилам Сетки