Динамически менять значения свойства конфигурации Spring Boot

Представим есть аннотированый метод doGet() аннотацией @GetMapping:

@GetMapping("/${yesterday}")
Currency doGet() { ... }

Сейчас свойство yesterday имеет статическое значение. Значение свойства = дата вчерашнего дня. Мы же не будем постоянно лезть в конфигурацию и менять руками значение свойсва на вчерашний день.

Какие есть способы динамически менять поле yesterday?

При попытке костылить получается такая хохма:

String yesterday = LocalDate.now().minusDays(1).toString();
@GetMapping(value = "/" + yesterday)  // Attribute value must be constraint
Currency doGet() { ... }

Ответы (2 шт):

Автор решения: ulxanxv

Если вы имеете ввиду просто делать биндинг из .properties/.yaml/.yml и т.д., то это можно делать вот так:

@GetMapping(path = "${custom.url}")
public String customUrl() {
    return "custom";
}

И сам файл application.yaml:

custom:
  url: "/custom"

!!! Если Вам нужно конкретно обращаться к Java классам и вычислять какие-то значение динамически, то Вам в путь дорогу к изучению SpEL :)

Пример маппинга с вчерашней датой с использование SpEL (ендпоинт будет доступен по URL http://localhost:8080/2022-06-05), но учтите, что если сервис будет работать более чем сутки, то вчерашняя дата будет уже не вчерашняя, потому что вычисляться это будет только при старте приложения:

@GetMapping("#{ T(java.time.LocalDate).now().minusDays(1).toString() }")
public String customUrl() {
    return "custom";
}

!!! Если вы имеете ввиду "на лету" изменять URL ендпоинта, то нужно смотреть в сторону ручной регистриции и ручного удаления данных эндпоинтов из контекста Spring

→ Ссылка
Автор решения: Roman-Stop RU aggression in UA

Присвойте эту часть пути переменной и проверяйте, что у нее значение "вчера", а если нет, то возвращайте статус 404 (т.е. "не найдено")

@GetMapping("/{day}")
public ResponseEntity<Currency> getForDay(
       @PathVariable @DateTimeFormat(iso=ISO.DATE) Date day) {
   if (isYesterday(day)) {
       ...
       return new ResponseEntity<>(currency, HttpStatus.OK);
   } else {
       return new ResponseEntity<>(null, HttpStatus.NOT_FOUND);
   }       
}
→ Ссылка