迁移至Jakarta EE11后Faces 4.1出现HTTP传输0状态码错误
Jakarta EE 11 (Faces 4.1) 中 "The Http transport returned a 0 status code" 错误的排查与解决
问题背景
将应用从旧版Jakarta EE迁移至Jakarta EE 11(使用Faces 4.1)后,频繁出现以下错误提示:
"The Http transport returned a 0 status code. This is usually the result of mixing ajax and full requests"
该问题在Jakarta EE 10(Faces 4.0)版本中未出现。
应用流程
- 通过自定义组件
util:autoCompleteFaces(基于ui:composition,包含h:inputText和h:selectOneListbox)实现自动补全功能 - 用户选择列表结果后,组件内置JavaScript触发
h:commandButton执行深度查询或获取更多信息
环境配置
- Jakarta EE 11
- Omnifaces 5.0
- Payara 7.2026.1
自动补全组件代码
<util:autoCompleteFaces id="autoCompleteInputA1" inputTextSelectedValue="#{searchInputBean.idA1}" inputTxtClass="form-control" messageTextClass="text-danger" inputTextValue="#{searchInputBean.searchWord}" placeholder="Enter a word" inputTextValueChangeListener="#{searchInputBean.valueChanged}" listItemdValue="#{searchInputBean.selectionList}" listBoxValueChangeListener="#{searchInputBean.completionItemSelected}" required="false" renderId="coreFace:result" > </util:autoCompleteFaces>
可能原因与解决方案
1. Faces 4.1 AJAX请求逻辑变更
Faces 4.1对AJAX请求的校验和上下文管理做了更新,当存在并发AJAX请求(比如自动补全的AJAX请求未完成就触发新请求),或者请求上下文被提前终止时,会抛出该错误。
2. 自定义组件JS触发逻辑冲突
组件内置的JavaScript可能未正确处理AJAX请求状态,导致未完成的AJAX请求与新触发的请求(同步或AJAX)产生冲突。
针对性解决方案:
- 串行化AJAX请求:修改组件JS逻辑,确保前一个Faces AJAX请求完成后再触发
h:commandButton。示例代码:function triggerCommandAfterAjax() { const activeRequests = jsf.ajax.activeRequests; if (activeRequests.length > 0) { setTimeout(triggerCommandAfterAjax, 100); } else { document.getElementById("yourCommandButtonId").click(); } } - 统一使用AJAX请求:确保
h:commandButton通过f:ajax发起请求,避免同步请求与AJAX请求混合:<h:commandButton id="queryBtn" action="#{searchBean.deepQuery}"> <f:ajax execute="@form" render="coreFace:result" /> </h:commandButton> - 排查渲染目标异常:暂时移除
util:autoCompleteFaces的renderId属性,测试是否仍报错,逐步验证渲染目标组件是否存在上下文冲突。 - 调整Payara配置:在Payara管理控制台的
HTTP Service-Connector中,延长connectionTimeout参数,避免请求因超时被提前终止。 - 升级OmniFaces版本:尝试升级到最新版OmniFaces 5.x,修复可能存在的Jakarta EE 11适配问题。
3. 调试建议
- 用浏览器开发者工具Network面板,观察请求的触发顺序和状态,确认是否存在请求被取消(status=0)的情况。
- 查看Payara服务器日志,获取完整错误堆栈,定位请求异常终止的具体环节。
内容的提问来源于stack exchange,提问作者PeterL355
相关产品推荐
相关产品推荐

