如何使JAX-WS端点接受SOAP1.2消息

时间:2016-11-09 12:49:39

标签: soap spring-boot wsdl cxf jax-ws

我有一个基于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消息。我如何实现这一目标?

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);