我有一个基于Spring Boot的项目,使用CXF构建SOAP Web服务。
发送SOAP 1.1消息(使用SOAPUI)工作正常,但是当我尝试发送SOAP消息时(当然使用相同的WSDL),我收到消息"A SOAP 1.2 message is not valid when sent to a SOAP 1.1 only endpoint"
。
该消息是自我解释的,但我无法理解为什么我的终端不接受1.2消息。
我的WSDL包含soap12的正确绑定和命名空间。
在我的spring @Configuration类中,我将其添加到CXF端点bean:
endpoint.setBindingConfig(new BindingConfiguration()
{
@Override
public String getBindingId()
{
return SOAPBinding.SOAP12HTTP_MTOM_BINDING;
}
});
那没有用。
当我变得更加绝望时,我尝试了@BindingType
和@SOAPBinding
注释,当然这些注释都不起作用,然后我用SaajSoapMessageFactory
尝试SoapVersion.SOAP_12
。没有工作。我在<extension>true</extension><protocol>Xsoap1.2</protocol>
中尝试了jaxws-maven-plugin
。失败。
端点显然未配置为接收SOAP 1.2消息。我如何实现这一目标?
答案 0 :(得分:0)
看起来您发送的请求正在命中SOAP 1.1端点而不是SOAP 1.2。
如果您的WSDL是使用自顶向下方法构建的,请确保wsdl中存在SOAP绑定for SOAP 1.2。 SOAP 1.2的端口(wsdl:port)也必须出现在wsdl中的wsdl:service下。
如果它是使用自下而上方法构建的,请确保在启用mtom时,此注释@BindingType(value = SOAPBinding.SOAP12HTTP_MTOM_BINDING)在您的SIB上,否则使用@BindingType(value = javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING )。
然后在使用maven插件生成客户端wsdl时,请务必使用<extension>true</extension>
。
在上述之后,例如,如果您在wsdl:service部分中使用带有2个端口的wsdl,如下所示:
<wsdl:service name="TestService">
<wsdl:port name="TestPortSoap11" binding="tns:TestPort12Binding">
<soap:address location="http://127.0.0.1:8081/testSoap11Endpoint"/>
</wsdl:port>
<wsdl:port name="TestPortSoap12" binding="tns:TestPort12Binding">
<soap12:address location="http://127.0.0.1:8081/testSoap12Endpoint"/>
</wsdl:port>
</wsdl:service>
要使用soap 1.2端点,请确保通过调用以下内容获取服务实例:
TestPortType testService = new TestService().getTestPortSoap12();
请注意粗体&#34; new中的文字 。TestService的()得到的 TestPortSoap12 强>()&#34;正在匹配的名称 wsdl中的 SOAP 1.2端口名称。
在您的Web服务客户端配置中,确保您使用的端点地址指向SOAP 1.2端口,在我们的示例中,例如,它http://127.0.0.1:8081/testSoap12Endpoint而不是{{3} }。
如果这些步骤失败,请分享wsdl片段(显示wsdl:service部分)和@Configuration Web服务弹簧配置。
答案 1 :(得分:0)
我明白了。我需要在实现端点时设置绑定URL。由于某些不明原因,之后设置它不起作用。
EndpointImpl endpoint = new EndpointImpl(springBus(), statusService(), SOAPBinding.SOAP12HTTP_BINDING);