Java Web服务SOAP1.1转SOAP1.2的代码修改方法
CXF Web服务切换至SOAP 1.2的调整方案
异常根因
抛出A SOAP 1.2 message is not valid when sent to a SOAP 1.1 only endpoint错误的核心原因,是服务端端点初始化时默认加载了SOAP 1.1协议栈的处理链,无法校验、处理客户端发送的SOAP 1.2格式请求报文,触发协议层校验失败。
具体代码修改项
1. 接口层补充显式SOAP1.2绑定注解
现有服务接口的@SOAPBinding仅声明了报文参数样式,未指定协议版本,需要在接口类级别补充添加@BindingType注解,强制JAX-WS运行时加载SOAP1.2的协议绑定:
// 原有接口注解保持不变,新增以下注解 @BindingType(value = javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING) @HandlerChain(file = "/handler-chain.xml") @WebService(targetNamespace = "http://tsb.eto.com/terp/ws/v2", name = "Terp-v2") @XmlSeeAlso({/* 原有ObjectFactory引用列表保持不变 */}) @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE) public interface TerpV2 { // 原有接口方法定义保持不变 }
注意:
SOAP12HTTP_BINDING是JAX-WS规范定义的SOAP 1.2 HTTP绑定标准标识,运行时会自动替换默认的SOAP 1.1绑定实现。
2. 服务发布逻辑适配(按需检查)
服务发布环节如果直接使用默认初始化逻辑,会加载SOAP1.1的协议栈,需要根据实际发布方式做适配:
- 手动调用
Endpoint.publish()发布的场景:需要在发布实例上显式设置SOAP1.2绑定,替代默认创建的端点实现// 替换原有默认发布逻辑的参考代码 Endpoint ep = Endpoint.create(new SoapImpl()); // 显式指定SOAP1.2绑定 ep.setBinding(SOAPBindingFactory.createSOAP12Binding()); ep.publish("对应服务发布地址"); - Spring集成CXF的场景:需要在端点配置中指定
bindingUri属性为http://www.w3.org/2003/05/soap,覆盖自动配置加载的默认SOAP1.1绑定。
3. 对外暴露WSDL的一致性校验
现有代码中注释了固定的wsdlLocation配置,该设置符合适配SOAP1.2的要求——CXF会根据代码中的绑定配置动态生成对外暴露的WSDL元数据。需要注意:
不要将固定的WSDL文件路径指向原SOAP1.1版本的WSDL文件,否则会导致客户端解析到的元数据和服务端实际协议栈不匹配,触发协议校验异常。
4. 自定义Handler链适配检查
接口配置了自定义处理链/handler-chain.xml,需要检查链中自定义Handler的实现逻辑:
- 确认不存在硬编码校验SOAP1.1命名空间的逻辑,避免Handler在协议校验层提前拦截SOAP1.2格式的请求,抛出格式不合法的错误。
验证方式
服务重启后查看启动日志,确认对应端点的绑定标识为SOAP1.2协议,再使用客户端发送SOAP1.2格式的请求,确认原有协议不匹配异常消失。
内容的提问来源于stack exchange,提问作者fatherazrael
相关产品推荐
相关产品推荐

