JSF 2.1 条件字段验证

Posted

技术标签:

【中文标题】JSF 2.1 条件字段验证【英文标题】:JSF 2.1 conditional field validation 【发布时间】:2011-10-11 09:41:08 【问题描述】:

我有以下 JSF 2.1 页面

<h:selectOneRadio value="#userBean.newUser">
    <f:selectItem itemValue="0" itemLabel="new User" />
    <f:selectItem itemValue="1" itemLabel="existing User" />
</h:selectOneRadio>
<br />
<h:inputText value="#userBean.customerId" id="customerId" />
<h:message for="customerid" />
<br />
<h:inputText value="#userBean.firstName" id="firstName" />
<h:message for="fisrtName" />
<br />
<h:inputText value="#userBean.lastName" id="lastName" />
<h:message for="lastName" />
<br />
<h:commandButton value="Submit" action="#userBean.login" />

这是我的豆子:

public class UserBean 

    private String customerId;
    private String newUser= "0";
    private String firstName;
    private String lastName;

    // Getters and seeters ommited.

我需要通过以下方式验证此表单:

如果选择了“新用户”单选按钮,则应验证所有表单输入。如果选择“现有用户”,我只需要验证客户 ID。

我尝试了 Hibernate Validation,还尝试了通过实现 javax.faces.validator.Validator 接口的自定义验证器。

我能以某种方式实现这样的功能吗?

【问题讨论】:

自定义验证器有什么问题..?为什么要将新用户的标志存储在字符串中? 如何有条件地设置自定义验证器?将其存储为字符串有什么问题? 好吧,我会使用布尔值或通过用户的 id 查找...无论如何.. 如果您的用户已经存储在数据库中,您不能检查您的验证器,即有一个 ID,如果没有 - 验证所有字段,如果是 - 只验证客户 ID 字段 您可以检查条件(读取父组件属性),并且只有通过运行验证逻辑。如果验证失败,此逻辑将抛出 ValidationException。 谢谢,我解决了这个问题。 【参考方案1】:

您可以编写一个custom validator,它检查父 UI 组件并仅在特定条件下执行验证。这很复杂。也许看看ExtVal 及其@SkipValidation 注释?

@SkipValidation("#person.role eq 'admin'")
@Required
@Equals("person.password")
@NotEquals("password")
private String oldPassword;

【讨论】:

以上是关于JSF 2.1 条件字段验证的主要内容,如果未能解决你的问题,请参考以下文章

必填字段的 JSF 验证

JSF:在验证成功或失败时有条件地更新

JSF 不支持跨字段验证,有解决方法吗?

jsf一次验证两个字段[重复]

使用 JSR 303 在 JSF 中使用内联消息进行跨字段验证

如何从 JSF/ADF 验证器中获取旧值?