Дата как ключ карты в файле свойств YAML - PullRequest
0 голосов
/ 04 июня 2018

Как связать значение даты в ключе карты Java из свойства YAML с помощью Spring Boot?

Файл свойства YAML:

settings:
  calendar:
    2018-06-04: 2018-06-25
    2018-07-15: 2018-07-20

Класс свойств:

Назначениекарта calendar предназначена для перевода с одной даты на другую.

@ConfigurationProperties(prefix = "settings")
public class CalendarSettings {

  @DateTimeFormat(pattern = "yyyy-MM-dd")
  private Map<LocalDate, LocalDate> calendar = new HashMap<>();

  public Map<LocalDate, LocalDate> getCalendar() {
    return calendar;
  }

  public void setCalendar(
    Map<LocalDate, LocalDate> calendar) {
    this.calendar = calendar;
  }
}

При этой настройке я получаю следующее исключение:

Property: settings.null
Value: 2018-06-04
Reason: Failed to convert property value of type 'java.lang.String' to required type 'java.time.LocalDate' for property 'null'; 
nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'java.time.LocalDate': 
no matching editors or conversion strategy found

Я борюсь с тем, как аннотировать свойство календаряв CalendarSettings.class - если это возможно.Или как создать какой-нибудь десериализатор.

1 Ответ

0 голосов
/ 04 июня 2018

Если вы запустите приложение в режиме отладки, вы увидите следующее исключение:

Caused by: java.time.format.DateTimeParseException: Text '2018-06-04' could not be parsed at index 4
    at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949) ~[na:1.8.0_162]
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851) ~[na:1.8.0_162]
    at java.time.LocalDate.parse(LocalDate.java:400) ~[na:1.8.0_162]
    at org.springframework.format.datetime.standard.TemporalAccessorParser.parse(TemporalAccessorParser.java:69) ~[spring-context-5.0.6.RELEASE.jar:5.0.6.RELEASE]
    at org.springframework.format.datetime.standard.TemporalAccessorParser.parse(TemporalAccessorParser.java:46) ~[spring-context-5.0.6.RELEASE.jar:5.0.6.RELEASE]
    at org.springframework.format.support.FormattingConversionService$ParserConverter.convert(FormattingConversionService.java:200) ~[spring-context-5.0.6.RELEASE.jar:5.0.6.RELEASE]

Причина, по которой это происходит, связана с синтаксическим анализатором по умолчанию (TemporalAccessorParser* 1006).*) использование локализованных преобразователей даты для сопоставления String с LocalDate.Чтобы решить эту проблему, вы можете написать свой собственный конвертер:

@Component
@ConfigurationPropertiesBinding
public class LocalDateConverter implements Converter<String, LocalDate> {

    @Override
    public LocalDate convert(String timestamp) {
        return LocalDate.parse(timestamp);
    }
}

Если вы зарегистрируете этот компонент с аннотацией @ConfigurationPropertiesBinding, он будет выбран при анализе свойств приложения.В методе LocalDate.parse(CharSequence) используется конвертер ISO_LOCAL_DATE, который должен нормально работать в вашем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...