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



我的控制器有一个接受大量查询参数的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 ...
}

而且,我想传递 minDate 是具有以下格式的 URL,yyyy-MM-dd但我需要将其转换为以下格式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

感谢您的帮助:)

您可以用比搜索注释魔术解决方案更简单的方式执行此操作。

只需在您的 CriteriaDTO 中添加一个额外的 LocalDateTime 获取器:

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

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

定义 setter 并使用 SimpleDateFormat 解析

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

我建议使用atStartOfDay,而不是使用自定义反序列化程序将此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

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

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

相关内容

  • 没有找到相关文章