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
相关产品推荐
相关产品推荐

