This :
<h:outputLabel for="birthdate">Birthdate (yyyy-MM-dd)</h:outputLabel>
<h:inputText id="birthdate" value="#{userController.user.birthdate}">
<f:convertDateTime pattern="yyyy-MM-dd" />
<f:ajax event="blur" render="birthdateMessage" />
</h:inputText>
<h:message id="birthdateMessage" for="birthdate" />
在表单中就像一个魅力。但我似乎找不到在实体上移动此验证的方法:
@Temporal(TemporalType.DATE) // pattern ?
@Past
private Date birthdate;
如果我删除 <f:convertDateTime pattern="yyyy-MM-dd" />
表单将无法正确验证。所以我应该将它保留在表单中 - 或者有没有办法在实体中通过验证(就像我对电子邮件等其他字段所做的那样)
奖励:这是将日期传递给持久层的正确方法吗?它会处理时区等吗?我总是在 SE 中使用 Joda,而 IIRC Date 是最有问题的 Java 类之一。但是,当我对表中的实体进行逆向工程时(使用 Eclipse JPA 项目选项 从表中创建实体),这就是我得到的(在 (MySQL) 表中的 birthdate 属性是 DATE 类型)。
编辑:我发现在实体上进行所有验证比在 View 或 Controller 上进行验证更好——欢迎提出异议
最佳答案
<f:convertDateTime>
不是验证器,而是转换器。 JSR303 Bean Validation API 不提供转换器,只提供验证器。这就是它不能被某些 JSR303 注释取代的原因。
关于时区,JSF 默认使用 GMT。如果您确保环境的其余部分也依赖于 GMT,那么您就安全了。但是,如果您依赖于不同的时区,那么您可以在应用程序范围的基础上或在特定于转换器的基础上告诉 JSF。可以在这个答案中找到详细信息:JSF convertDateTime renders the previous day .
关于mysql - 验证 JSF 实体中的持久日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21514937/