验证JSF中的任意对象?

时间:2012-01-16 12:54:43

标签: validation jsf jsf-2 bean-validation

因此,您可以在绑定bean属性上使用JSR-303注释验证输入:

class Ticket {
    @MinAge(18)
    Person person;
}

class Person {
    @Min(1) @Max(100)
    int age;
}

<p:inputText id="age" value="#{bean.ticket.person.age}" />

这里,Person.age属性被验证(在1..100之间)没有问题。

问题是,我想验证外部实例(person.age&gt; = 18)。但是如何让属性bean.ticket.person知道验证?

我想要类似的东西:

<p:inputText id="age" value="#{bean.ticket.person.age}">
    <f:validate value="#{bean.ticket.person}" />
</p:inputText>

或者:

<p:inputText id="age" value="#{bean.ticket.person.age}">
    <f:validator id="jsr303-validator" value="#{bean.ticket.person}" />
</p:inputText>

问题是,我无法将值传递给<f:validator />。我想在验证过程中添加额外的属性,而不仅仅是页面上出现的输入。

P.S。这是一个简化的例子,真正的应用是:

...
<p:inputText id="principalLabel" value="${activeACL.principal.label}" readonly="true" />
<p:commandButton value="Choose..." onclick="choosePrincipalDialog.show()" />
...
<p:commandButton value="Save" action="${bean.saveACL}" oncomplete="editACLDialog.hide()" update="index" />

ACL_DTO类型的activeACL:

class ACL_DTO {
    ...
    @IdRequired
    Principal_DTO principal;
}

此处,choosePrincipalDialog的actionListener将隐式更改${activeACL.principal.id},最初为null。 IdRequired是一个自定义约束,它约束对象的id成员属性不为null或-1。

虽然,我可以更改为在id属性上使用@NotNull,并添加一个隐藏输入以启用对id的验证:

class Principal_DTO {
    ...
    @NotNull
    @Min(0)
    Long id;
}

...
<h:inputHidden id="principalId" value="${activeACL.principal.id}" />
<h:inputText id="principalLabel" ...

但是,通过这种方式,我再也无法重用验证消息了。给用户提供“此字符串不应为空”,“此值不应为-1”等消息似乎毫无意义。

1 个答案:

答案 0 :(得分:1)

首先,我认为你应该确保只将bean用作可以获得输入的地方。之后,将值分配给模型。在我看来,bean不应该直接用作模型,而应该用作web-form-b​​acking bean(每个web表单都有不同的bean)。

其次,我同意您遇到的情况是您依赖其他数据来执行验证(例如,如果用户选择US作为国家/地区,则不应将邮政编码等留空)。您可以在这里查看如何实现自定义注释: Cross field validation with Hibernate Validator (JSR 303)

如果你不使用bean验证,你总是可以实现一个自定义验证器类,甚至可以直接在bean中定义验证方法:http://docs.oracle.com/javaee/6/tutorial/doc/bnavb.html#bnave