我想用JSF2 ajax和Bean Validation创建一个简单的寄存器表单,它允许在验证失败时在ui:repeat value="#{facesContext.messageList}" var="m"
区域显示自定义格式的所有错误消息。我的代码适用于Mojarra,但当我切换到Myfaces2.1时,消息永远不会显示ui:repeat
- 它只留下一个空的ol
标记,facesContext.messageList
似乎是空的。它仍适用于h:messages
,但这不是我想要的
但是,今天我找到了一个奇怪的解决方法:将属性rendered="#{not empty facesContext.messageList}"
添加到ui:repeat
的父组件之一。
我无法理解为什么这个rendered="..."
很重要,因为errorDisplay组件每次都会重新渲染。这个测试#{not empty facesContext.messageList}
会改变什么吗?
<h:form>
Name:<h:inputText value="#{hello.name}" id="name"/>
<br/>
Age :<h:inputText value="#{hello.age}" id="age" converterMessage="'Age'必须是一个数字"/>
<h:commandLink value="register" type="submit">
<f:ajax execute="@form" render="errorDisplay"/>
</h:commandLink>
<h:panelGroup> <!--rendered="#{not empty facesContext.messageList}"-->
<h:panelGroup id="errorDisplay"><!--rendered="#{not empty facesContext.messageList}"-->
<span>发生以下错误:</span>
<ol style="color:red;">
<ui:repeat value="#{facesContext.messageList}" var="m">
<li>${m.detail}</li>
</ui:repeat>
</ol>
</h:panelGroup>
</h:panelGroup>
</h:form>