我正在构建一个登录表单复合组件 . 使用它的页面将传递一个将验证用户名和密码的事件处理程序 . 通常(不使用复合组件)当我们通过 postValidate
执行交叉字段验证时,事件处理程序必须按名称查找字段的组件 . 验证器最好不要这样做,因为这些是应该抽象的组件的内部细节 .
知道如何在不了解复合组件的内部细节的情况下,在 postValidate
处理程序中获取用户名和密码字段的转换值吗?
Update: 这一点不是为了避免按名称查找组件,而是为了能够跨域验证复合组件's fields in a way that doesn' t要求使用页面和/或bean来了解组件的内部细节 .
3 回答
这可以做到 . 在以下代码中,请特别注意复合组件中的
postValidate
事件和后备组件中的postValidate
方法 . 请注意它如何解析MethodExpression
属性并调用传入方法 .这是复合组件:
支持组件:
完整性的
LoginFormValue
类:使用登录表单的页面:
最后,页面的支持bean:
f:event postValidate
方法不会给你留下很多选择 .我更喜欢的选项是对表单的最后一个组件进行验证,然后使用binding和f:attribute传入其他组件 .
例如
然后在验证器中,您可以从UIInput中获取其他组件:
我使用JsfWarn来解决类似的问题,我认为它以更清洁的方式解决了你的问题 .
与JSF验证器不同,在模型更新后,在调用应用程序之后,在渲染响应之前执行WarningValidators,因此您只需访问应用程序以获得验证结果 .
并将验证器添加到目标字段: