【问题标题】:Using same validation logic for Rest, JSF, biz layer对 Rest、JSF、biz 层使用相同的验证逻辑
【发布时间】:2015-04-20 12:10:28
【问题描述】:

我想知道是否有一种方法,如果有,正确的方法是什么,在 EJB bean 和 Web 服务中为 JSF 使用相同的验证逻辑(一个实现) - 休息(高枕无忧)。

目前所有层都使用 Hibernate 实体,因为我觉得我的项目太小,无法在表示层上使用额外的 DTO 使其复杂化,但其余服务将使用 DTO。

我该如何解决这个问题?

谢谢!

【问题讨论】:

    标签: validation jsf jakarta-ee jpa jax-rs


    【解决方案1】:

    Java EE 正是为此目的提供了 JSR303 Bean Validation API。您可能已经在@NotNull 和朋友身边见过他们。默认情况下,JSF 和 JPA 都会自动识别和支持这一点。 JAX-RS 通常没有应该接受/验证输入的“视图”,因此这里不相关。

    所以,而不是例如JSF

    <h:inputText value="#{bean.entity.property}" required="true" />
    

    单独

    private String property;
    

    你可以使用

    <h:inputText value="#{bean.entity.property}" />
    

    @NotNull
    private String property;
    

    如果您通过 JAX-RS 放置数据,JPA 也可以使用它。

    在 JSF 方面你需要考虑的唯一一件事是它默认将空字段设置为空字符串而不是 null。您使用以下web.xml 上下文参数告诉JSF 将提交的空字符串值解释为null

    <context-param>
        <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
        <param-value>true</param-value>
    </context-param>
    

    另见:

    【讨论】:

    • 嘿,巴鲁斯!感谢您的快速回答,我确实在需要的地方使用了 JSR303 和 JSF 验证器。我发现我必须进行更复杂和交叉验证的问题,其中某些字段依赖于其他字段,甚至依赖于多个字段,因此 DTO 中的填充字段可能存在有效/无效组合。这就是为什么我打算在填充 Hibernate 实体并保存到数据库之前检查其余服务中的这些字段。
    • 只需使用自定义 bean 验证约束。您甚至可以在班级级别进行验证。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多