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

Payara 5+JSF中多次提交后h:dataTable属性丢失求助

问题分析与解决方案

问题现象

在Payara 5与JSF的组合环境中,出现以下异常表现:

  • 页面通过<ui:include>引入简单xhtml文件后,点击触发applyFilter方法的commandButton 2-3次,<h:dataTable>渲染时所有属性(如border、style、cellpadding等)全部丢失;
  • 若将引入文件的内容直接复制到主页面,而非通过<ui:include>引入,则功能完全正常;
  • 仅执行GET请求时,表格显示无任何异常。

最小复现代码

控制器代码

@Named("datatableController")
@ViewScoped
public class DatatableController implements Serializable {

    List<String> items = null;

    @PostConstruct
    protected void initData() {
        items = new ArrayList<String>();
        items.add("First");
        items.add("Second");
    }

    public List<String> getItems() {
        return items;
    }

    public void applyFilter() {
        items.add("Another one");
    }
}

主页面代码

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core">

<h:body>
    <div style="width:720px;margin: 0 auto">
        <h:form>
            <ui:include src="Decorami.xhtml" /> 

            <h:commandButton value="Filtra" 
                             action="#{datatableController.applyFilter}" />
            <br/><br/>  
           <h:dataTable value="#{datatableController.items}" 
                        var="item" border="0" cellpadding="2" cellspacing="0" rules="all" 
                        style="border:solid 1px;min-width: 600px">

                <f:facet name="caption">
                    <h:outputText value="Some sort of table"/>
                </f:facet>

                <h:column>
                    <f:facet name="header">
                        <h:outputText value="Column 1"/>
                    </f:facet>
                    #{item.toString()}
                </h:column>
                <h:column>
                    <f:facet name="header">
                        <h:outputText value="Column 2"/>
                    </f:facet>
                    <h:outputText value="Second column"/>
                </h:column>
            </h:dataTable>   
        </h:form>
    </div>
</h:body>
</html>

引入文件Decorami.xhtml代码

<ui:composition>
    Decorami 2   
</ui:composition>

可能原因与解决方案

1. 遗留JSF参数问题

web.xml中遗留的旧版javax.faces参数确实可能引发此类渲染异常,建议排查调整:

  • 检查javax.faces.PARTIAL_STATE_SAVING,若设置为false尝试改为true(Payara 5默认开启部分状态保存,关闭后易引发视图状态异常);
  • 移除已废弃的JSF配置参数,例如javax.faces.FACELETS_SKIP_COMMENTS等不再适用的旧参数;
  • 确保javax.faces.STATE_SAVING_METHOD设置为server(默认值),避免客户端状态保存带来的序列化问题。

2. Payara 5特定视图状态Bug

该问题与Payara 5中视图状态处理和<ui:include>的组合兼容问题高度相关,因无法迁移至Payara 6,可尝试以下临时修复:

  • 在<h:form>中添加prependId="false"属性,避免视图状态ID冲突;
  • 为<ui:include>添加唯一id属性,例如<ui:include id="includedContent" src="Decorami.xhtml" />,确保组件树唯一性;
  • 手动重置视图状态:在applyFilter方法末尾添加FacesContext.getCurrentInstance().getViewRoot().reset()(注意此操作会重置整个视图,需评估业务影响);
  • 将Payara 5更新至最新补丁版本(Payara 5.2022.5及以后版本修复了多个JSF视图渲染相关Bug)。

3. 视图作用域Bean的序列化问题

虽然示例中Bean实现了Serializable,仍需确认:

  • items集合使用可序列化的实现类(示例中ArrayList符合要求);
  • 视图作用域Bean未持有不可序列化对象,避免视图状态序列化失败导致渲染异常。

内容的提问来源于stack exchange,提问作者Filippo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 14:59:52