【问题标题】:JSR 303 - javax.validation - Validate a dateJSR 303 - javax.validation - 验证日期
【发布时间】:2011-06-09 08:30:09
【问题描述】:

我有一个 Java EE 应用程序,我想验证一个日期。 使用字符串我这样做:

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
...
@NotNull
@Size(min = 1, max = 255)
private String myString;

但现在我有两个日期要验证。用户可以在前端系统中在文本字段中写入一个字符串,该文本字段将通过 JSON 传输(我必须使用文本字段,我不能使用日期选择器)。

所以我的后端在我的域类中确实有这个:

@DateTimeFormat(pattern = "dd.MM.yy")
@Temporal(value=TemporalType.TIMESTAMP)
private Date myStartDate;

@DateTimeFormat(pattern = "dd.MM.yy")
@Temporal(value=TemporalType.TIMESTAMP)
private Date myEndDate;

我想根据“dd.MM.yyyy”格式进行验证。如何做到这一点?

而且,我不这么认为,但是否有自动验证来检查开始日期是否早于结束日期?我只找到了@Future@Past

所以唯一的解决方案是使用@Pattern,一个正则表达式?!

提前感谢您的帮助,最好的问候。

【问题讨论】:

  • 两件事:@DateTimeFormat 不是 JSR-303 的一部分,mm 代表分钟,而不是几个月。还有如何将"dd.MM.yy" 更改为"dd.MM.yyyy" 失败?由于您似乎正在使用 Spring MVC(此注释是其中的一部分),您可能需要修改/重新标记您的问题。至少,JSR 303 不为此提供 any 注释。
  • 可以,我可以改成dd.MM.yyyy,但是没有验证。
  • 我也无法理解模式验证在Date 而不是String 上有何用处,因为Date 不存储有关其内部格式的任何信息。无论如何,我不做Spring,但我认为你只需要实现一个Validator。如果是 JSF,至少我会这样做。
  • 验证 JSON 表示中的日期格式是您的 JSON 解析器/映射器的责任。您需要重新表述您的问题并描述用于解析 JSON 的技术。
  • 首先,@Pattern 仅适用于 String(如其 javadoc 中所述)。其次,反斜杠是String 中的转义字符。你需要用另一个转义它来代表一个实际的。

标签: java validation date


【解决方案1】:

@DateTimeFormat 用于 Web 数据绑定期间,将请求参数映射到对象时(假设您已使用 <mvc:annotation-driven/> 或手动启用它。)将 JSON 反序列化为对象时通常不会使用它。你在 JSON 中的阅读情况如何?你用什么反序列化它?您无法在格式化事实之后验证 java Date 对象,您必须在反序列化之前预先检查。

没有内置多字段约束。如果要比较对象的两个属性,则需要编写自己的类型级别约束。

【讨论】:

  • 感谢您的回复。我想用@Pattern(regexp="\t(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d\t") 验证它,但是有一个错误,它是一个无效的转义序列。是的,我可以在发送到后端系统之前检查它,但是我无法访问前端系统,我只是“后端大师”,我必须检查日期格式是否可以,所以 Pattern 就足够了第一步。
  • 你必须在java正则表达式中加倍所有的\\,因为\已经是java字符串的转义字符,在它进入正则表达式引擎之前。
猜你喜欢
  • 2015-01-10
  • 2011-10-30
  • 2018-08-15
  • 1970-01-01
  • 1970-01-01
  • 2018-08-24
  • 2013-11-23
  • 2013-12-27
  • 1970-01-01
相关资源
最近更新 更多