我想在 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/