java - 在 Spring 中使用验证将 ZonedDateTime 字段限制为毫秒时间的 3 位数字

标签 java spring validation hibernate-validator

我想在 Spring MVC 请求中验证一个输入 DTO,特别是 ZonedDateTime 字段最多应包含 3 位毫秒级别的数字,即它不能是完整的纳秒精度。除此之外,输入请求应遵循 ISO 日期时间格式。我可以将该字段设为字符串,然后用正则表达式限制它,但我更喜欢将其保留为 ZonedDateTime,这样我就不需要再次解析它。

该对象看起来像这样:

@Data
public class MeasurementDTO {

    private ZonedDateTime date;
    @Digits(integer = 20, fraction = 8) private BigDecimal value;

}

这是一个嵌套的 DTO,其中父对象作为带有 @Valid 注释的 @RequestBody 出现。

我尝试过 @JsonFormat 但我似乎无法限制毫秒部分。 有什么方法可以做到这一点,还是我应该自己将其解析为字符串,然后处理它?或者甚至只是将其保留在 ZonedDateTime,然后检查纳秒组件以查看它是否存在于自定义 validator 中?

多亏了 Tim 的回答,我记得 Java Date 无论如何都不比毫秒更精确,所以我更新了问题以使用 ZonedDateTime ,它的精度高达纳秒精度。我确实希望能够在用户尝试传递更高的精度时向他们发出警告,如果使用日期,此信息就会被吞没。

最佳答案

您可能不认为这是一个完整的答案,但 java.util.Date 只存储最多毫秒的精度,而不是超出该精度。请参阅乔恩·斯基特的 answer here ,或阅读source code for CalendarDate ,这表明它除了毫秒级存储之外什么也没有。

因此,通过 Hibernate 验证将 Date 限制为毫秒精度是没有意义的,因为类型本身已经带有此限制。

关于java - 在 Spring 中使用验证将 ZonedDateTime 字段限制为毫秒时间的 3 位数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55102015/

相关文章:

java - 如何重写compareto方法来订购员工的工资?

java - Clojure编译并使用cygwin运行

java - 使用 gson 作为解析器登录系统到 json 不起作用

java - Spring boot 项目的实时重新加载

java - gradle依赖文件构建gradle

java - java中如何提高文件读取效率及其数据插入

java - Spring security - 限制对我的更新个人资料页面的访问

sql - Golang SQL 查询语法验证器

spring-boot - Spring Boot : Custom Validation in Request Params

javascript - 同时使用 2 个函数来验证表单