Weblogic12.2.1.3部署带EnableAsync注解的Spring Batch提交后空指针异常咨询
问题诱因分析
- 错误页面配置不一致:堆栈中NPE触发在
weblogic.servlet.internal.ServletResponseImpl.sendContentError方法,该方法空指针的核心诱因是Weblogic服务器未配置全局错误页,或错误页配置指向不存在的资源。两台同版本服务器表现不同,优先排查故障机的错误页配置与正常机存在差异。 - 异步请求与错误页过滤器冲突:你使用了
@EnableAsync注解,Spring Batch任务提交后异步执行时,原始HTTP响应可能已经提交并关闭,此时如果异步任务抛出异常,Spring Boot的ErrorPageFilter会尝试往已关闭的响应中写入错误信息,触发Weblogic容器内部的空指针。如果两台服务器的异步线程池参数配置不同,故障机线程池资源不足导致任务超时、异常的概率更高,就会稳定复现问题。 - 服务器缓存损坏:堆栈末尾指向JSP写入逻辑,故障机可能存在JSP编译缓存损坏的情况,渲染错误页面时读取缓存失败触发空指针。
- 容器配置参数差异:两台服务器的weblogic.xml、web.xml配置不一致,故障机缺少对应错误状态码的映射配置,或配置值为空。
- Weblogic补丁版本差异:两台服务器虽大版本均为12.2.1.3,但补丁安装情况不同,故障机缺少Weblogic官方针对Servlet响应错误处理的相关补丁,触发已知的空指针BUG。
解决办法
- 同步Weblogic错误页配置:登录Weblogic控制台,进入「服务>Web服务器>目标服务器名称>HTTP」选项卡,对比两台服务器的「默认错误页面路径」配置,将故障机配置调整为与正常机完全一致,避免错误跳转时空指针。
- 调整错误页过滤器适配异步场景:在Spring Boot配置类中新增自定义
ErrorPageFilter,跳过异步请求的错误页处理逻辑,代码示例如下:
import org.springframework.boot.web.servlet.support.ErrorPageFilter; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Configuration public class WebConfig { @Bean public ErrorPageFilter errorPageFilter() { return new ErrorPageFilter() { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { // 异步请求已经提交响应,跳过错误页处理 if (request.isAsyncStarted()) { filterChain.doFilter(request, response); return; } super.doFilterInternal(request, response, filterChain); } }; } }
- 清理Weblogic临时缓存:停止故障节点服务,删除对应服务实例下的
tmp、cache目录所有文件,重启服务后重新部署WAR包,清除损坏的JSP编译缓存。 - 同步容器配置文件:对比两台服务器部署包中的
weblogic.xml、WEB-INF/web.xml配置,确保error-page相关配置完全一致,无空值或无效路径。 - 优化异步任务返回逻辑:提交Spring Batch异步任务后直接返回任务提交成功的响应,不要等待异步任务执行结果,避免后续任务异常触发响应写入逻辑。
- 同步Weblogic补丁版本:执行
java weblogic.version命令对比两台服务器的补丁安装列表,给故障机安装与正常机完全一致的补丁集,修复容器已知BUG。
内容的提问来源于stack exchange,提问作者Harshil
相关产品推荐
相关产品推荐

