1

我试图在它适用的数据表中的字段旁边放置一条错误消息,但我无法在支持 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 设置不正确。

4

1 回答 1

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'}"
于 2013-06-06T13:12:39.140 回答