如何识别数据表中的h:消息?

时间:2013-06-05 20:58:23

标签: jsf datatable message

我正在尝试在其应用的数据表中的字段旁边放置一条错误消息,但我在辅助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没有正确设置。

1 个答案:

答案 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'}"