JDeveloper 12.2.1.4中panelAccordion下af:showDetailItem标签不显示问题
原本在JDeveloper 12.2.1.3.0环境运行的代码,部署升级到WebLogic Server 12.2.1.4.0后,panelAccordion组件下的af:showDetailItem在UI上无法显示标签,升级前功能正常。不仅动态绑定的text不显示,连硬编码文本也失效。
失效的代码片段:
<af:panelAccordion id="pa1" discloseMany="false" discloseNone="true" styleClass="#{(pageFlowScope.recordView == pageFlowScope.ThumbnailMB.selectAllView or pageFlowScope.recordView == pageFlowScope.ThumbnailMB.selectView or pageFlowScope.recordView == pageFlowScope.ThumbnailMB.selectFullView) ? 'Accordion' : ''}" partialTriggers="b1 b2 b3"> <af:iterator value="#{pageFlowScope.ThumbnailMB.caseAlt == 1 ? bindings.CategoryVO1.collectionModel : bindings.CategoryVO2.collectionModel}" var="cat" id="it1" rows="-1" binding="#{pageFlowScope.ThumbnailMB.categoryIterator}"> <af:showDetailItem text="#{pageFlowScope.ThumbnailMB.truncatedCategory} (#{cat.DocumentCount})" id="sd1" disclosureListener="#{pageFlowScope.ThumbnailMB.changeCategory}" visible="#{pageFlowScope.ThumbnailMB.categoryVisible}" rendered="true" disclosed="#{pageFlowScope.ThumbnailMB.categoryDisclosed}" disclosedTransient="true" flex="1" styleClass='#{cat.IsRecordAdded == 1 ? "HighlightedRecordCategory" : "RegularRecordCategory"}' binding="#{pageFlowScope.ThumbnailMB.categoryTab}" shortDesc="#{pageFlowScope.ThumbnailMB.category}">
可能的原因分析
组件绑定的冲突问题:在af:iterator循环中,所有生成的af:showDetailItem都绑定到同一个bean属性
#{pageFlowScope.ThumbnailMB.categoryTab},这在WebLogic 12.2.1.4对应的ADF Faces 12.2.1.4.0版本中会导致组件实例被重复覆盖。新版本对组件树的状态管理更严格,重复绑定会破坏组件的初始化流程,导致标签文本无法渲染。flex属性的布局行为变更:新版本ADF Faces对flex布局的解析遵循更严格的CSS规范,设置
flex="1"会让showDetailItem的内容区域优先占据可用空间,挤压标签的显示区域。旧版本对flex属性的处理更宽松,不会影响标签的渲染,新版本则会导致标签被隐藏。迭代器上下文的组件初始化问题:af:iterator在新版本中调整了组件树的构建时机,动态生成的showDetailItem的text属性可能没有在正确的上下文下完成绑定。当iterator的数据源切换(通过caseAlt切换CategoryVO1/CategoryVO2)时,属性绑定的更新逻辑未被正确触发,导致文本未被渲染到UI上。
disclosedTransient属性的状态管理影响:设置
disclosedTransient="true"后,新版本ADF Faces在组件状态保存和恢复上的逻辑有变化。在部分刷新(由partialTriggers触发)场景下,showDetailItem的标签状态未被正确保留,导致刷新后标签无法显示。
内容的提问来源于stack exchange,提问作者Ramappa kalhalli

