Динамически менять значения свойства конфигурации 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 шт):
Если вы имеете ввиду просто делать биндинг из .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
Присвойте эту часть пути переменной и проверяйте, что у нее значение "вчера", а если нет, то возвращайте статус 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);
}
}