我正在尝试在其应用的数据表中的字段旁边放置一条错误消息,但我在辅助bean中识别它时遇到了问题。我的表单顶部有一个区域用于非字段特定的错误/信息,但是当错误特定于某个字段(即“电子邮件”)时,我希望该消息出现在那里。
这是我的XHTML :(为清晰起见,我删除了表单中其他不相关的部分)
<h:form styleClass="form" id="DeliveryOptionsForm">
<h:dataTable value="#{sesh.delOptionList}" var="delOption">
<h:outputText id="emailLabel" styleClass="#{(delOption.deliveryOption == 'EMAIL') ? '' : 'hide-field'}" value="Email " />
<h:message class="errorMessage" for="email" id="emailError" />
</h:dataTable>
</h:form>
这是我的支持bean:
FacesContext.getCurrentInstance().addMessage("DeliveryOptionsForm:email",
new FacesMessage(FacesMessage.SEVERITY_ERROR, "Email address cannot be
left blank when selecting email delivery.", null));
当我运行代码时,收到错误消息:
[05/06/13 13:50:28:371 PDT] 00000026 RenderRespons W There are some unhandled
FacesMessages, this means not every FacesMessage had a chance to be rendered.
These unhandled FacesMessages are:
- Email address cannot be left blank when selecting email delivery.
有谁知道我做错了什么?我感觉消息的clientId没有正确设置。
答案 0 :(得分:1)
您不应该在辅助bean操作方法中进行验证。这是执行验证的错误位置。您应该在普通验证器中进行验证。
使用JSF内置验证:
<h:inputText id="foo" value="#{bean.foo}" required="true" requiredMessage="Please enter foo" />
<h:message for="foo" />
或者使用自定义验证程序,其中您将ValidatorException
与所需邮件一起投放:
<h:inputText id="foo" value="#{bean.foo}" validator="fooValidator" />
<h:message for="foo" />
与
@FacesValidator("fooValidator")
public class FooValidator implements Validator {
@Override
public void validate(FacesContext context, UIComponent component, Object value) {
// ...
if (!valid) {
throw new ValidatorException(new FacesMessage("Fail!"));
}
}
}
无论哪种方式,它都会自动结束正确的消息组件。
您没有在任何地方说明具体的功能要求,但遗憾的是您的代码段不完整,但我的印象是,只有当另一个属性具有特定值时,您才真正想要设置required="true"
。在这种情况下,只需做例如:
required="#{delOption.deliveryOption == 'EMAIL'}"