在spring项目中,我想从LocalDate
d构造函数参数创建@Autowire
,其值在.properties
文件中。我想做的两件事:
my.date
,则应通过解析属性值来创建参数设置属性后,以及使用以下内容时:
@DateTimeFormat(pattern = "yyyy-MM-dd") @Value("${my.date}") LocalDate myDate,
...
我收到此错误: java.lang.IllegalStateException:无法将'java.lang.String'类型的值转换为必需类型'java.time.LocalDate':找不到匹配的编辑器或转换策略
我还使用iso = ...
来使用具有相同结果的ISO日期。
LocalDate.now()
我尝试使用默认值:
@Value("${my.date:#{T(java.time.LocalDate).now()}}") LocalDate myDate,
...
但我得到同样的错误。
原谅我对Spring的无知,但我怎样才能实现这两个目标呢?
答案 0 :(得分:4)
我知道两种方式。一个是任何对象的通用 - 在自定义setter上使用@Value注释
public class Example {
@Value("#{T(java.time.LocalDate).parse('${property.name}')}")
private LocalDate localDate;
}
第二个是LocalDate / LocalDateTime
property.name=2018-06-20
示例属性:
SELECT a.USER_ID, c.AD_ID, c.CREATED_DATE_ FROM $A$ a, $C$ c, $B$ b
WHERE (b.USER_ID IS NULL AND a.CUSTOMER_ID = c.CUSTOMER_ID)
答案 1 :(得分:0)
尝试将其添加到您的属性文件中:
spring.jackson.date-format=com.fasterxml.jackson.databind.util.ISO8601DateFormat
spring.jackson.time-zone=UTC
并删除@DateTimeFormat
注释
关于LocalDate.now()初始化。尝试以这种方式使用现场注入:
@Value("${my.date}") LocalDate myDate = LocalDate.now();
答案 2 :(得分:0)
如果您还想指定日期格式,请在字段上使用以下内容:
@Value("#{T(java.time.LocalDate).parse('${date.from.properties.file}', T(java.time.format.DateTimeFormatter).ofPattern('${date.format.from.properties.file}'))}")
答案 3 :(得分:0)
正如Pavel在其他答案中提到的,有两种方法。
我提供了两种类似的修改方式,以通过OP处理第二点。
如果该属性不在属性文件中,则参数应为 使用LocalDate.now()
创建
@Component
public class Example {
private LocalDate localDate;
@Value("${property.name}")
private void setLocalDate(String localDateStr) {
if (localDateStr != null && !localDateStr.isEmpty()) {
localDate = LocalDate.parse(localDateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
}else{
localDate = LocalDate.now();
}
}
}
我还是比较喜欢第二种方式...
public class Example {
@Value("#{T(java.time.LocalDate).parse('${property.name}', T(java.time.format.DateTimeFormatter).ofPattern('yyyy-MM-dd')) ?: T(java.time.LocalDate).now()}")
private LocalDate localDate;
}
答案 4 :(得分:0)
首先,您可以创建一个转换器:
@Component
@ConfigurationPropertiesBinding
public class LocalDateConverter implements Converter<String, LocalDate> {
@Override
public LocalDate convert(String s) {
if (s == null) {
return null;
}
return LocalDate.parse(s);
}
}
您的配置类将自动使用它进行转换。
对于第二个,您可以执行以下操作:
if(my.date == null) iso = LocalDate.now()