请求参数字段的Spring Boot更改日期格式为DTO

时间:2020-02-04 15:19:24

标签: java spring-boot datetime dto localdate

我的控制器有一个GET端点,该端点接受许多查询参数。因此,为了创建对Mongo数据库的动态查询,我创建了一个@QueryParam,而不是使用多个CriteriaDTO

我的控制器端点:

@GetMapping
public List<MyObject> getAll(@Valid CriteriaDTO criteriaDTO){
    return myObjectService.findAll(criteriaDTO);
} 

public class CriteriaDTO {

    private int offset = 0
    private int limit = 20
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate minDate

    // getters, setters ...
}

而且,我想传递minDate是具有以下格式yyyy-MM-dd的URL,但是我需要将其转换为以下格式yyyy-MM-dd'T'HH:mm:ss.SSS

我的问题是:是否有任何注释或其他可以接受第一种格式yyyy-MM-dd并自动将其转换为其他格式的注释?

请注意,如果我打了以下电话:

http://localhost:8080/api/myobject?minDate=2020-01-01

然后criteriaDTO.getminDate()将返回2020-01-01'T'00:00:00.000

感谢您的帮助:)

4 个答案:

答案 0 :(得分:1)

您可以用比搜索注释魔术解决方案更简单的方法来做到这一点。

只需向您的CriteriaDTO添加一个LocalDateTime的附加getter:

public LocalDateTime getMinDateTime() {
    return this.minDate.atTime(0, 0, 0, 0);
}

并在需要时间而不是日期的地方使用它。

答案 1 :(得分:1)

我建议使用atStartOfDay,而不是使用自定义反序列化器将此2020-01-01转换为2020-01-01'T'00:00:00.000。而且由于您正在处理输入数据,所以我建议将其作为单独的操作

LocalDateTime date = criteriaDTO.getminDate().atStartOfDay()  //2020-01-01'T'00:00

您还可以添加格式化程序DateTimeFormatter以获得所需的输出

date.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) //2020-01-01'T'00:00:00

答案 2 :(得分:1)

使用SimpleDateFormat定义设置器并进行解析

public void setMinDate() {
    if(!minDate.empty()) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
        this.minDate = formatter.parse(minDate)
    }

}

答案 3 :(得分:1)

您有几种选择。检查您到底需要什么,

    LocalDate date = LocalDate.now();

    LocalDateTime dateTime = LocalDateTime.of(date, LocalTime.MIDNIGHT);
    System.out.println(dateTime); //2020-02-04T00:00:00

    System.out.println(DateTimeFormatter.ISO_DATE_TIME.format(dateTime)); //2020-02-04T00:00:00

    System.out.println(date.atStartOfDay()); ////2020-02-04T00:00

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");
    System.out.println(formatter.format(dateTime)); //2020-02-04T00:00:00.000

您需要修改dto中的吸气剂以格式化它,例如:

class CriteriaDTO {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");

    private int offset = 0
    private int limit = 20
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate minDate

    public String getMinDate() {
        return formatter.format(LocalDateTime.of(minDate, LocalTime.MIDNIGHT));
    }

    // getters, setters ...
}
相关问题