我需要一些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>
问题基本上是为什么甚至调用不是Date的字段的getValueAsDate方法,甚至屏幕上甚至没有日期字段类型?这可能是我在JSF生命周期中遗漏(或误解)的一部分,或者JSF / PrimeFaces中的部分更新如何工作.
更新#1:
在另一个调试会话中注意到,这不仅发生在部分更新中,而且在最初渲染屏幕时已经出现.看起来好像所有的EL表达式都是一直被评估的,这也导致了我的后备对象中的其他属性(当一个属性被请求并且它不存在时,它使用值为null创建).
更新#2:
渲染配置字段的代码使用ui:repeat en条件ui:片段(尝试使用h:panelGroups)来呈现配置字段的特定输入元素.
<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>
尝试h:panelGroup和ui:片段组合2.
这可以被认为是Mojarra具体的< ui:repeat>报告为
issue 3215,固定在2.2.7,并按照
issue 3221在2.1.29中反映.简单地说,这个问题归结为:< ui:repeat>在保存自己的状态时不尊重其EditableValueHolder儿童的状态,因此基本上表现为在保存状态期间,这些孩子的呈现属性不被尊重.以下相关问答:
PropertyNotFoundException on conditionally rendered subclasses in ui:repeat中还有其他后果.
原文链接:https://www.f2er.com/ajax/159850.html鉴于您使用的是Mojarra 2.1.x,最好的办法是升级到2.1.29.如果您的环境允许(Servlet 3.0等),升级到最新的2.2.x也是可能的.
替代方案将由MyFaces替换Mojarra,或者替换< ui:repeat>< ui:fragment>由< c:forEach>< c:if> ;.