Omnifaces validateBean:将消息附加到特定组件

时间:2016-03-14 08:18:16

标签: jsf bean-validation omnifaces

我正在使用Omnifaces <o:validateBean />来使用带有类级别约束的JSR303 bean验证。

整件事情非常好。验证消息显示在Primefaces <p:messages />组件中。现在我想知道是否可以将错误消息缩小到更精确的组件(即特定元素上的<p:message />标签)?在下面的示例中,我想将错误消息指向<p:message /> id="id_msg_anniversary"组件(如果可能,则id="id_msg_anniversary"id="id_msg_wedding")。

我的意图之一是使用bean验证来验证所有内容,而不是使用<o:validateOrder /><o:validateMultiple />

@DayIsBeforeAnniversary
@Entity
public class Person implements Serializable
{
    @Temporal(TemporalType.DATE)
    private Date weddingDay;

    @Temporal(TemporalType.DATE)
    private Date silverWeddingAnniversary;
    ...
}
<p:messages id="id_messages" />

<h:outputLabel value="Wedding Day" />
<p:message id="id_msg_wedding" display="icon" for="id_wedding" />
<p:calendar 
    id="id_wedding" 
    value="#{personController.person.weddingDay}"> <br />

<h:outputLabel value="Silver Wedding Anniversary" />
<p:message id="id_msg_anniversary" display="icon" for="id_anniversary" />
<p:calendar 
    id="id_anniversary" 
    value="#{personController.person.silverWeddingAnniversary}" /> <br/>

<p:commandButton 
    value="test" 
    action="#{personController.navigate()}" 
    update="@all"/>

<o:validateBean value="#{personController.person}" />
public class DayIsBeforeAnniversaryValidator implements ConstraintValidator<DayIsBeforeAnniversary, Person>
{
    @Override
    public boolean isValid(Person person, ConstraintValidatorContext context)
    {
        return person == null
            || person.getWeddingDay() == null
            || person.getSilverWeddingAnniversary() == null
            || person.getWeddingDay().before(person.getSilverWeddingAnniversary());
    }
    ...
}
public @interface DayIsBeforeAnniversary { ... }

为了澄清我可以附上更多代码。

1 个答案:

答案 0 :(得分:2)

<o:validateBean>将其消息与<h:form>相关联。因此,您需要做的就是确保在所需位置有<p:message for="formId">。请注意,您可以拥有多个。以下是启动示例。

<h:form id="formId">
    <p:inputText id="foo" ... />
    <p:message for="foo" />
    <p:message for="formId" />
    ...
    <p:inputText id="bar" ... />
    <p:message for="bar" />
    <p:message for="formId" />
    ...
    <o:validateBean ... />
</h:form>

但我确实认为这不是最优雅的解决方案,当与ValidateMultipleFields家庭成员相比时,肯定不会,因为这个家庭有一个有用的showMessageFor属性。不幸的是,在<o:validateBean>上实现它也是非常复杂的,因为在BV约束违规错误和JSF输入字段之间技术上没有直接关系,因此必须根据bean属性和JSF组件树手动检查它,这是不完全是一个oneliner工作。