我需要一些JSF / PrimeFaces(3.5)建议。
我们有一个动态表单,表单可以由表单构建器配置,而支持bean是一个美化的HashMap
,其中包含一些额外的getter和setter,如(getValueAsDate
/ setValueAsDate
)。
我们的某个字段类型允许输入一个数字,当离开该字段时,会请求其他信息并更新部分表单。这似乎很好地工作。
<h:panelGroup id="clientInfo" layout="block" rendered="#{field.type == 'CLIENTINFO'}">
<h:outputLabel for="inputClientId">#{field.label}</h:outputLabel>
<p:inputText id="inputClientId" maxlength="9" value="#{handler.property(field.id).value}">
<p:ajax listener="#{handler.fetchClientDetails(field.id)}" partialSubmit="true" process="@this" update="@parent,:mainform:msgs"
</p:inputText>
<!-- Additional output text elements to display the name, address etc. -->
</h:panelGroup>
最近我们添加了一个字段,允许使用PrimeFaces日期选择器组件输入java.util.Date
。添加此字段类型后,部分更新停止工作。
<h:panelGroup id="date" layout="block" rendered="#{field.type == 'DATE'}">
<h:outputLabel for="inputDate">#{field.label}</h:outputLabel>
<p:calendar id="inputDate" value="#{handler.property(field.id).valueAsDate}" pattern="dd-MM-yyyy" maxlength="10">
<f:convertDateTime pattern="dd-MM-yyyy" />
</p:calendar>
</h:panelGroup>
当检查来自服务器的部分结果时,我们得到如下内容(其中12345是在上面的字段中输入的clientId)。
<partial-response>
<error>
<error-name>class java.text.ParseException</error-name>
<error-message><![CDATA[Unparseable date: "12345"]]></error-message>
</error>
</partial-response>
问题基本上是为什么它甚至为不是getValueAsDate
的字段调用Date
方法,或者屏幕上甚至没有日期字段类型?这可能是我对JSF生命周期缺失(或误解)或JSF / PrimeFaces中部分更新如何工作的原因。
在另一个调试会话中注意到,这不仅发生在部分更新中,而且在最初渲染屏幕时已经发生。似乎所有EL表达式都是一直被评估的,这也导致我的后备对象中的其他属性(当请求一个属性并且它不存在时,它使用值null
创建)。 p>
呈现已配置字段的代码使用ui:repeat
条件ui:fragment
s(已尝试h:panelGroup
)来呈现已配置字段的特定输入元素。
<ui:repeat value=#{handler.formFields} var="field">
<ui:fragment rendered="field.type == 'DATE'>
<!-- Specific fragment for date field -->
</ui:fragment>
<ui:fragment rendered="field.type == 'TEXT'>
</ui:fragment>
<ui:fragment rendered="field.type == 'REGEXP'>
</ui:fragment>
<ui:fragment rendered="field.type == 'CLIENT'>
</ui:fragment>
</ui:repeat>
尝试了2.
的h:panelGroup
和ui:fragments
组合
答案 0 :(得分:8)
这可以被识别为Mojarra特定的<ui:repeat>
错误,其被报告为issue 3215,在2.2.7中修复并按照issue 3221在2.1.29中向后移植。简单地说,问题归结为<ui:repeat>
在保存自己的州时不尊重其EditableValueHolder
子女的状态,因此基本上表现得好像那些孩子的rendered
属性从来没有在国家储蓄期间受到尊重。其他后果之一在以下相关问答中充实:PropertyNotFoundException on conditionally rendered subclasses in ui:repeat。
鉴于您使用的是Mojarra 2.1.x,最好的办法是升级到至少2.1.29。如果你的环境允许它(Servlet 3.0等),也应该可以升级到最新的2.2.x.
替代品将替换MyFaces的Mojarra,或者将<ui:repeat><ui:fragment>
替换为<c:forEach><c:if>
。