使用Camel与CXF构建WebService时SOAP版本不匹配问题排查
我来帮你拆解这个问题,核心是SOAP版本不匹配导致的错误,咱们一步步理清:
问题根源分析
你已经在代码里设置了endpoint.bindingId = SOAPBinding.SOAP12HTTP_BINDING,明确期望这个Endpoint处理SOAP 1.2请求,但错误提示"A SOAP 1.2 message is not valid when sent to a SOAP 1.1 only endpoint",说明实际生效的绑定还是SOAP 1.1。
至于设置dataFormat=RAW后错误消失,是因为RAW模式下Camel会跳过SOAP消息的解析与版本校验,直接传递原始报文,相当于绕开了问题,但这并不是根本解决办法。
配置失效的核心原因
只设置bindingId其实不足以让CXF启用SOAP 1.2绑定——这个参数只是标识绑定类型,但没有实际创建SOAP 1.2的绑定实例,CXF会默认 fallback 到SOAP 1.1。你找到的XML配置<cxf:binding><soap:soapBinding version="1.2"/></cxf:binding>,对应的就是要在Java代码中明确创建并绑定SOAP 1.2的实现。
正确的Java配置修改方式
你需要创建SOAP 1.2的Binding实例并赋值给CxfEndpoint的binding属性,修改你的cxfEndpoint() Bean如下:
@Bean("etp") open fun cxfEndpoint(): CxfEndpoint { val endpoint = CxfEndpoint() endpoint.beanId = "etp" endpoint.address = "/etp" endpoint.serviceClass = Product::class.java endpoint.wsdlURL = "wsdl/example.wsdl" endpoint.dataFormat = DataFormat.POJO // 新增SOAP 1.2绑定实例配置 val soapBindingFactory = Soap12BindingFactory() val soap12Binding = soapBindingFactory.createBinding(null, SOAPBinding.SOAP12HTTP_BINDING, null) endpoint.binding = soap12Binding endpoint.bindingId = SOAPBinding.SOAP12HTTP_BINDING return endpoint }
同时还要确保你的WSDL文件本身是SOAP 1.2规范的:
检查WSDL中的绑定节点,确保使用的是SOAP 1.2的命名空间
http://schemas.xmlsoap.org/wsdl/soap12/,而非SOAP 1.1的http://schemas.xmlsoap.org/wsdl/soap/。
内容的提问来源于stack exchange,提问作者well

