JDK8升级至JDK17后SOAP客户端HTTP请求头丢失问题
问题分析与解决方案
核心原因
JDK 17移除了内置的JAX-WS实现,且当前混用了Java EE时代的jaxws-rt 2.3.5与Jakarta EE依赖(如jakarta.annotation-api 2.1.1),导致MessageContext上下文传递机制不兼容,无法正常获取HTTP请求头。同时,代码中若仍使用旧的javax包路径的MessageContext,也会引发此问题。
解决方案步骤
1. 统一依赖到Jakarta兼容版本
将JAX-WS相关依赖替换为支持JDK 11+的Jakarta版本,确保依赖体系一致:
<!-- 替换原有jaxws-rt为Jakarta版本 --> <dependency> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-rt</artifactId> <version>3.0.2</version> <!-- 适配Jakarta EE 9,支持JDK11+ --> </dependency> <!-- 替换saaj-impl为对应Jakarta版本 --> <dependency> <groupId>com.sun.xml.messaging.saaj</groupId> <artifactId>saaj-impl</artifactId> <version>3.0.2</version> </dependency> <!-- 移除jakarta.annotation-api,jaxws-rt 3.0.2已包含兼容的Jakarta注解依赖 -->
2. 修正代码中的包路径导入
将代码中MessageContext相关的导入从javax替换为jakarta:
// 替换前 import javax.xml.ws.handler.MessageContext; import javax.xml.ws.handler.soap.SOAPMessageContext; // 替换后 import jakarta.xml.ws.handler.MessageContext; import jakarta.xml.ws.handler.soap.SOAPMessageContext;
3. 验证客户端处理器配置
确保SOAP客户端的处理器实现Jakarta版本的Handler接口:
public class CustomSOAPHandler implements jakarta.xml.ws.handler.soap.SOAPHandler<jakarta.xml.ws.handler.soap.SOAPMessageContext> { @Override public boolean handleMessage(SOAPMessageContext context) { // 尝试获取HTTP请求头 Map<String, List<String>> headers = (Map<String, List<String>>) context.get(MessageContext.HTTP_REQUEST_HEADERS); // 后续业务逻辑... return true; } // 实现其他必要方法:getHeaders、handleFault、close }
4. 额外配置(若仍存在问题)
若上述步骤后仍无法获取,可在创建客户端Port时添加属性,强制启用HTTP头传递:
Service service = Service.create(wsdlURL, serviceName); MyPort port = service.getPort(MyPort.class); // 添加JAX-WS RI特定属性,确保HTTP头被传递到处理器 BindingProvider bindingProvider = (BindingProvider) port; bindingProvider.getRequestContext().put("com.sun.xml.ws.client.handle.http.headers", true);
验证
完成上述修改后,重新构建项目并测试SOAP客户端请求,此时MessageContext.HTTP_REQUEST_HEADERS应能正常返回请求头Map。
内容的提问来源于stack exchange,提问作者manas021
相关产品推荐
相关产品推荐

