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" />
,表单将无法正确验证。所以我应该将其保留在表单中 - 或者是否有办法在实体中传递验证(正如我对其他字段所做的那样,如电子邮件等)
Bonus:这是将Date传递给持久层的正确方法吗?它会照顾时区等吗?我总是在SE中使用Joda和IIRC日期是最有问题的Java类之一。但是当我从表中反向设计实体时(使用Eclipse JPA项目选项从表中创建实体),这就是我得到的(在(MySQL)表中 birthdate 属性是DATE类型。
编辑:我发现在实体上进行所有验证比在视图或控制器上获得更好的风格 - 欢迎任何异议
答案 0 :(得分:1)
<f:convertDateTime>
不是验证器,而是转换器。 JSR303 Bean Validation API不提供转换器,仅提供验证器。这就是为什么它不能被一些JSR303注释所取代。
至于时区,JSF默认依赖GMT。如果您确保您的其他环境也依赖于GMT,那么您就是安全的。但是,如果您依赖于不同的时区,那么您可以在应用程序范围内或在转换器特定的基础上告诉JSF。详情可在以下答案中找到:JSF convertDateTime renders the previous day。