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

Java Spring Boot将请求参数字段的日期格式更改为DTO,java,spring-boot,datetime,dto,localdate,Java,Spring Boot,Datetime,Dto,Localdate,我的控制器有一个接受大量查询参数的GET端点。因此,我没有使用多个@QueryParam,而是创建了一个CriteriaDTO,以便对我们的Mongo数据库执行动态查询 我的控制器终结点: @GetMapping public List<MyObject> getAll(@Valid CriteriaDTO criteriaDTO){ return myObjectService.findAll(criteriaDTO); } public class CriteriaD

我的控制器有一个接受大量查询参数的
GET
端点。因此,我没有使用多个
@QueryParam
,而是创建了一个
CriteriaDTO
,以便对我们的Mongo数据库执行动态查询

我的控制器终结点:

@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 ...
}
@GetMapping
公共列表getAll(@Valid-CriteriaDTO-CriteriaDTO){
返回myObjectService.findAll(criteriaDTO);
} 
公共类标准{
私有整数偏移=0
私人整数限制=20
@日期时间格式(pattern=“yyyy-MM-dd”)
私有本地日期minDate
//能手,二传手。。。
}
我想传递minDate是URL,其格式如下
yyyy-MM-dd
,但我需要将其转换为以下格式
yyy-MM-dd'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


感谢您的帮助:)

您可以用比搜索注释魔法解决方案更简单的方法来完成

只需在您的标准中添加LocalDateTime的附加getter:

public LocalDateTime getMinDateTime() {
    return this.minDate.atTime(0, 0, 0, 0);
}
并在需要时间而不是日期的任何地方使用它。

我建议使用自定义反序列化程序将此
2020-01-01
转换为
2020-01-01'T'00:00:00.000
。而且,由于您正在操作输入数据,我建议您将其作为单独的操作来执行

LocalDateTime date = criteriaDTO.getminDate().atStartOfDay()  //2020-01-01'T'00:00
您还可以添加格式化程序以获得所需的输出

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

使用SimpleDataFormat定义setter和解析

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

}

你有几个选择。检查你到底需要什么

    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中修改getter以对其进行格式化,例如:

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 ...
}