You need to enable JavaScript to run this app. Java Web服务SOAP1.1转SOAP1.2的代码修改方法
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 08:06:01