Spring:从@Value参数创建LocalDate或LocalDateTime

Jos*_*osh 3 java spring autowired spring-boot

在spring项目中,我想LocalDate@Autowired构造函数参数创建一个值,该参数的值在.properties文件中。我想做两件事:

  1. 如果属性文件包含属性my.date,则应通过解析属性值来创建参数

设置属性后,以及使用以下命令时:

@DateTimeFormat(pattern = "yyyy-MM-dd") @Value("${my.date}") LocalDate myDate,
...
Run Code Online (Sandbox Code Playgroud)

我收到此错误:java.lang.IllegalStateException:无法将类型“ java.lang.String”的值转换为所需类型“ java.time.LocalDate”:找不到匹配的编辑器或转换策略

我还使用iso = ...来使用具有相同结果的ISO日期。

  1. 如果属性不在属性文件中,则应使用以下命令创建参数 LocalDate.now()

我尝试使用默认值,例如:

@Value("${my.date:#{T(java.time.LocalDate).now()}}") LocalDate myDate,
...
Run Code Online (Sandbox Code Playgroud)

但是我得到了同样的错误。

原谅我对Spring的无知,但是如何在这里实现两个目标?

GKi*_*lin 14

Spring Boot 2.5,完美运行:

application.yaml

my.date: 2021-08-14
my.time: "11:00"
Run Code Online (Sandbox Code Playgroud)
@Service
public class TestService {
    @Value("${my.date}")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    LocalDate myDate;

    @Value("${my.time}")
    @DateTimeFormat(iso = DateTimeFormat.ISO.TIME)
    LocalTime myTime;
}
Run Code Online (Sandbox Code Playgroud)


Pav*_*vel 6

我知道两种方式。一个通用于任何对象-在自定义设置器上使用@Value批注

@Component
public class Example {

    private LocalDate localDate;

    @Value("${property.name}")
    private void setLocalDate(String localDateStr) {
        if (localDateStr != null && !localDateStr.isEmpty()) {
            localDate = LocalDate.parse(localDateStr);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

第二个用于LocalDate / LocalDateTime

public class Example {
    @Value("#{T(java.time.LocalDate).parse('${property.name}')}")
    private LocalDate localDate;
}
Run Code Online (Sandbox Code Playgroud)

样本属性:

property.name=2018-06-20
Run Code Online (Sandbox Code Playgroud)


lub*_*nac 1

尝试将其添加到您的属性文件中:

spring.jackson.date-format=com.fasterxml.jackson.databind.util.ISO8601DateFormat
spring.jackson.time-zone=UTC
Run Code Online (Sandbox Code Playgroud)

并删除@DateTimeFormat注释

关于 LocalDate.now() 初始化。尝试以这种方式使用字段注入:

@Value("${my.date}") LocalDate myDate = LocalDate.now();
Run Code Online (Sandbox Code Playgroud)