JSF / PrimeFaces - 如何显示自定义验证器的消息,但不显示同一组件上的必需验证

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSF / PrimeFaces - 如何显示自定义验证器的消息,但不显示同一组件上的必需验证相关的知识,希望对你有一定的参考价值。

我有一个使用PrimeFaces的JSF2实现。我使用的是<p:selectOneRadio />组件。当用户在无线电组件中选择“否”时,我想显示自定义消息。我已经为此创建了一个自定义验证器,并且与消息组件一起工作正常。但是,该组件也是必需的。我不希望所需组件的“值是必需的”验证错误显示在消息组件中。在这种情况下,我只希望突出显示字段和标签。

因此,问题是:如何指定给定的<p:message />组件仅显示来自我的自定义验证器的错误,而不是来自所需验证器的错误?

几年前我看到一个类似问题的答案说,你可以将消息for属性设置为一个实际上不存在的组件,并通过FacesContext将消息添加到该组件。如:<p:message for="fooMsg" /> ... FacesContext.getCurrentInstance().addMessage("fooMsg",msg)

但是,这似乎不起作用。 JSF抛出一个错误,它无法找到组件“fooMsg”。

这是我目前的代码。

零件:

<p:outputLabel for="foo" id="foolbl"
    value="Some label text." />
<br />
<p:message for="foo" />
<p:selectOneRadio id="foo" layout="pageDirection"
    widgetVar="fooVar" required="true">
<f:selectItem itemLabel="Yes" itemValue="Yes" />
<f:selectItem itemLabel="No" itemValue="No" />
<p:ajax update="@this foolbl" process="@this" />
<f:validator validatorId="FooValidator" />
</p:selectOneRadio>

验证器:

@FacesValidator("FooValidator")
public class FooValidator implements Validator {

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {

        if (value != null) {
            String sValue = (String) value;
            if (sValue.trim().equalsIgnoreCase("No")) {
                FacesMessage msg = new FacesMessage("Summary",
                        "Detail");
                msg.setSeverity(FacesMessage.SEVERITY_ERROR);

                throw new ValidatorException(msg);
            }
        }
    }

}
答案

首先,这是默认的JSF行为。要解决您的问题,您可以使用jQuery检查是否没有选择单选按钮并在这种情况下隐藏消息,例如:

<h:form id="form">
    <p:outputLabel for="foo" id="foolbl" value="Some label text." />
    <br />
    <p:message id="foomsg" for="foo" />
    <p:selectOneRadio id="foo" layout="pageDirection" widgetVar="fooVar"
        required="true">
        <f:selectItem itemLabel="Yes" itemValue="Yes" />
        <f:selectItem itemLabel="No" itemValue="No" />
        <p:ajax process="@this" update="@this foolbl foomsg" />
        <f:validator validatorId="FooValidator" />
    </p:selectOneRadio>

    <p:commandButton process="@this foo" update="foo foolbl foomsg"
        oncomplete="if( !PF('fooVar').checkedRadio.length ) $('#form\:foomsg').hide();" />
</h:form>

看看commandButton的oncomplete属性。

以上是关于JSF / PrimeFaces - 如何显示自定义验证器的消息,但不显示同一组件上的必需验证的主要内容,如果未能解决你的问题,请参考以下文章

JSF / PrimeFaces - 如何显示自定义验证器的消息,但不显示同一组件上的必需验证

如何使用 PrimeFaces 在 JSF 上重定向?

在 primefaces 3 和 jsf 中,我上传了文件,但在目标位置没有显示图像

使用 JSF 2.0 和 Primefaces 设置项目

从支持 Bean 刷新 JSF/PrimeFaces 接口

JSF 2.0 更新 primefaces 对话框第一次不起作用