You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 07:45:04