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

时间:2018-02-02 03:48:29

标签: java spring spring-boot autowired

在spring项目中,我想从LocalDate d构造函数参数创建@Autowire,其值在.properties文件中。我想做的两件事:

  1. 如果属性文件包含属性my.date,则应通过解析属性值来创建参数
  2. 设置属性后,以及使用以下内容时:

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

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

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

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

      我尝试使用默认值:

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

      但我得到同样的错误。

      原谅我对Spring的无知,但我怎样才能实现这两个目标呢?

5 个答案:

答案 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()