验证JSF实体中的持久日期

时间:2014-02-02 19:11:37

标签: mysql jsf date bean-validation

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类型。

编辑:我发现在实体上进行所有验证比在视图或控制器上获得更好的风格 - 欢迎任何异议

1 个答案:

答案 0 :(得分:1)

<f:convertDateTime>不是验证器,而是转换器。 JSR303 Bean Validation API不提供转换器,仅提供验证器。这就是为什么它不能被一些JSR303注释所取代。

至于时区,JSF默认依赖GMT。如果您确保您的其他环境也依赖于GMT,那么您就是安全的。但是,如果您依赖于不同的时区,那么您可以在应用程序范围内或在转换器特定的基础上告诉JSF。详情可在以下答案中找到:JSF convertDateTime renders the previous day