gpt4 book ai didi

spring-boot - 日期作为 YAML 属性文件中的映射键

转载 作者:行者123 更新时间:2023-12-05 08:54:14 25 4
gpt4 key购买 nike

如何使用 Spring Boot 从 YAML 属性将日期值绑定(bind)到 Java 映射键?

YAML 属性文件:

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

属性类:

calendar map 的用途是将一个日期转换为另一个日期。

@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 中注释日历属性——如果可能的话。或者如何创建某种反序列化器。

最佳答案

如果您在 Debug模式下运行应用程序,您会看到抛出以下异常:

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) 使用本地化日期转换器将 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 转换器,在您的情况下应该可以正常工作。

关于spring-boot - 日期作为 YAML 属性文件中的映射键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50681970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com