通常,消息的PrimeFaces标记显示全局以及特定于字段的消息。我想要做的是只显示全局消息(globalOnly="true"
),但如果任何字段的验证失败,也会显示一条公共消息。无论有多少字段失败,只需输入一条消息,例如“请更正您的数据”。字段特定错误已显示在输入字段旁边,因此无需显示两次。
我正在为每个输入使用复合组件(Textbox
,Dropdown
,Radios
,...)。每个字段的验证应在blur
上使用文本框进行,并且可能在valuechanged
上进行下拉和收音机。
现在我想要处理两种类型的验证。首先是JSF本身带来的标准验证器。例如required="true"
,还有validateRegex
,validateLength
,...
然后有一些值我要检查另一个后端。对于那些我可能会在我的bean中创建方法并将它们称为我的
的监听器<p:inputText id="#{cc.attrs.name}"
value="#{cc.attrs.val}"
styleClass="#{cc.attrs.iconClass}"
required="#{cc.attrs.required}"
requiredMessage="#{cc.attrs.requiredMessage}">
<p:ajax event="blur" process="@form" update="outer-wrapper"
listener="#{cc.attrs.someValidationMethod}" />
</p:inputText>
所以基本上我想只有一个全局消息,如果任何字段验证失败。我知道可以用rendered="#{facesContext.validationFailed}"
渲染一个额外的框,但我更喜欢有一个全局消息。是否有开箱即用的设置或是否必须实施?
答案 0 :(得分:2)
我使用phase listener来执行此操作。这大致是我的实现(使用OmniFaces):
public class ValidationFailedListener implements PhaseListener
{
@Override
public void afterPhase(PhaseEvent event) { }
@Override
public void beforePhase(PhaseEvent event) {
if (Faces.isValidationFailed()) {
Messages.addGlobalError("Your validation failed message");
}
}
@Override
public PhaseId getPhaseId() {
return PhaseId.RENDER_RESPONSE;
}
}
您应该在faces-config.xml
:
<lifecycle>
<phase-listener>your.ValidationFailedListener</phase-listener>
</lifecycle>
我的实际实现使用消息包来显示本地化消息。
如果你不能使用OmniFaces,这里是使用vanilla JSF的相关代码:
if (FacesContext.getCurrentInstance().isValidationFailed()) {
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
"Your validation failed message",
null);
FacesContext.getCurrentInstance().addMessage(null, message);
}