HCL Portal 9.5 JSF portlet页面跳转后Faces Message无法渲染问题
这个问题是HCL Portal 9.5自带的JSF 2.2 Portlet Bridge的兼容问题,同时你迁移时缺失了portal场景专属的配置项,可按以下步骤排查修复:
1. 补充缺失的web.xml配置
Portal的Portlet分为ACTION和RENDER两个独立阶段,旧版WPS7的Bridge默认会自动跨阶段保留未渲染的FacesMessage,但HCL Portal 9.5的Bridge默认关闭了该逻辑,同时JSF 2.2新增的客户端窗口模式和Portal的窗口逻辑冲突,会导致消息归属ID匹配错误。在web.xml中添加以下配置即可解决90%以上的同类问题:
<!-- 开启Bridge跨请求保留未渲染的FacesMessage --> <context-param> <param-name>com.ibm.faces.portlet.PRESERVE_MESSAGES_ACROSS_NON_FOCUS</param-name> <param-value>true</param-value> </context-param> <!-- 关闭JSF 2.2默认的客户端窗口模式,避免和Portlet窗口逻辑冲突 --> <context-param> <param-name>javax.faces.CLIENT_WINDOW_MODE</param-name> <param-value>none</param-value> </context-param> <!-- 增大Facelets缓冲区,避免Portlet嵌套场景下内容截断 --> <context-param> <param-name>javax.faces.FACELETS_BUFFER_SIZE</param-name> <param-value>1048576</param-value> </context-param>
2. 手动兼容方案(如果配置不生效)
如果添加配置后仍有问题,可以在添加消息的代码中主动开启Flash作用域的消息保留逻辑,强制跨请求传递消息:
public String doBtnMsg() { FacesContext facesContext = FacesContext.getCurrentInstance(); // 开启Flash保留消息,仅非AJAX请求需要加,AJAX请求可省略 facesContext.getExternalContext().getFlash().setKeepMessages(true); facesContext.addMessage(null, new FacesMessage("page 2 msg updated")); return null; }
3. 修复PrimeFaces autoUpdate兼容问题
HCL Portal的Bridge会给所有前端组件ID自动添加Portlet命名空间前缀,PrimeFaces 7.0的p:autoUpdate逻辑偶尔会出现ID匹配失败,导致messages组件无法被正常更新。可以手动给commandButton指定要更新的messages组件ID,替代autoUpdate的自动匹配:
<!-- 第二页的Show message按钮改为显式指定update属性 --> <p:commandButton id="btnMsg" value="Show message" action="#{pc_TestJSF22View2.doBtnMsg}" update="msgGlobal2" />
内容的提问来源于stack exchange,提问作者peterremec
相关产品推荐
相关产品推荐

