JSF / PrimeFaces - 如何为自定义验证器显示消息,但不为同一组件上的必需验证显示消息
JSF / PrimeFaces - How to display message for custom validator but not for required validation on the same component
我有一个使用 PrimeFaces 的 JSF2 实现。我正在使用 <p:selectOneRadio />
组件。当用户在无线电组件中选择 "No" 时,我想显示一条自定义消息。我为此目的创建了一个自定义验证器,并且与消息组件一起一切正常。但是,该组件也是必需的。我不希望消息组件中出现所需组件的 "Value is required" 验证错误。在这种情况下,我只想突出显示该字段和标签。
因此,问题是:如何指定给定的 <p:message />
组件仅显示来自自定义验证器的错误,而不显示来自所需验证器的错误?
几年前我看到一个类似问题的答案说你可以将消息 for
属性设置为一个实际上不存在的组件,然后通过面孔上下文。像这样:
<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 属性。
我有一个使用 PrimeFaces 的 JSF2 实现。我正在使用 <p:selectOneRadio />
组件。当用户在无线电组件中选择 "No" 时,我想显示一条自定义消息。我为此目的创建了一个自定义验证器,并且与消息组件一起一切正常。但是,该组件也是必需的。我不希望消息组件中出现所需组件的 "Value is required" 验证错误。在这种情况下,我只想突出显示该字段和标签。
因此,问题是:如何指定给定的 <p:message />
组件仅显示来自自定义验证器的错误,而不显示来自所需验证器的错误?
几年前我看到一个类似问题的答案说你可以将消息 for
属性设置为一个实际上不存在的组件,然后通过面孔上下文。像这样:
<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 属性。