在 JSF 2 Web 应用程序中使用 Bean Validation (JSR 303) 是个好主意吗?

Posted

技术标签:

【中文标题】在 JSF 2 Web 应用程序中使用 Bean Validation (JSR 303) 是个好主意吗?【英文标题】:Is it a good idea to use Bean Validation (JSR303) in JSF2 Webapplications? 【发布时间】:2014-05-01 14:35:06 【问题描述】:

我即将使用 JavaServer Faces 2 创建一个 Web 应用程序。在后端,使用 EJB3.1 和 JPA2 等其他常用 JEE 技术进行管理。关键是,我遵循一些域驱动架构,这意味着域模型在 JSF 层用作支持 bean 模型,并且通常在持久层作为持久实体持久化。在不同的层使用相同的模型产生了只定义相关模型限制的优势。在此级别使用 Bean Validation 将此模型的限制提供给 JSF、JPA 等。

现在我的问题是,在 JSF2 中使用 bean 验证是否是个好主意?我担心将验证限制直接链接到模型可能是错误的方法,因为 JSF 生命周期的验证通常发生在访问模型之前(对于它的验证规则)。据我所知,JSF 验证不是在模型处理期间进行的(又名第 4 阶段:应用模型值),而是在其自己的专用时间点(第 3 阶段:流程验证)的早期进行,并应用于组件值(提交的值)。但是,如果在模型处理期间没有进行验证,JSF 验证(在第 3 阶段)应该如何知道 bean 的实际限制?

感谢您对此的任何澄清。

[编辑] 更具体地说,现在我正在为此目的使用 Bean Validation 并且它正在工作,因为无效值被拒绝并且正确显示了一个 faces 消息。我只是想知道这是否是正确的方法,据我了解,验证可能发生在错误的 JSF 阶段,因此可能导致组件模型不一致。

【问题讨论】:

您究竟是如何得出结论/观察到 bean 验证是在更新模型值阶段而不是验证阶段执行的?或者这只是一个没有实际测试/调试过的盲目假设? 这是一个盲目的假设,因为它是定义验证规则的模型(由于 bean 验证)。现在有了您的评论,我很好奇 JSF impl 是否能够从模型中提取或引用这些规则,并在组件值的验证阶段应用它们.. 使用你的方法 (balusc.blogspot.de/2006/09/debug-jsf-lifecycle.html) 来验证调用了哪些阶段:RESTORE_VIEW(1) -> APPLY_REQUEST_VALUES(2) -> PROCESS_VALIDATIONS(3) -> RENDER_RESPONSE(6) 所以事实上它是APPLY_MODEL_VALUES(4) 阶段被调用的误解。感谢您的提示。 【参考方案1】:

您可以在数据传输对象 (DTO) 中添加所有这些 bean 验证,该 DTO 负责在 JSF 中解除 UI 数据。在所有验证成功后,您可以将 DTO 复制到实体(模型)对象。

为了将(DTO's to Entity)或(Entity to DTO's)复制,我们可以使用第三方库,例如 dozer mapper。

这将避免直接对模型层的验证限制。我的意思是实体对象

【讨论】:

为什么要避免在实体上放置 bean 验证注释?

以上是关于在 JSF 2 Web 应用程序中使用 Bean Validation (JSR 303) 是个好主意吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 URL 参数的 JSF 托管 Bean 方法调用

CAS 身份验证后在 JSF 托管 Bean 中获取 LDAP 属性

在 Web 过滤器中访问会话范围的 JSF 托管 bean

CAS认证后在JSF Managed Bean中获取LDAP属性

如何(以及何时?)在 JSF 2.0 中删除 Session 范围的 bean

如何从非人脸请求中调用 JSF 支持 bean 方法?