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

How do I make JAX-WS endpoint accept SOAP1.2 messages

我有一个 Spring 基于引导的项目,使用 CXF 构建 SOAP Web 服务。

发送 SOAP 1.1 消息(使用 SOAPUI)工作正常,但是当我尝试发送 SOAP 1.2 消息时(当然使用相同的 WSDL)我收到消息 "A SOAP 1.2 message is not valid when sent to a SOAP 1.1 only endpoint"。 该消息不言自明,但我不明白为什么我的端点不接受 1.2 消息。

我的 WSDL 包含 soap12 的正确绑定和命名空间。

在我的 spring @Configuration class 中,我将其添加到 CXF 端点 bean:

    endpoint.setBindingConfig(new BindingConfiguration()
    {
        @Override
        public String getBindingId()
        {
            return SOAPBinding.SOAP12HTTP_MTOM_BINDING;
        }
    });

这没有帮助。 当我变得更加绝望时,我尝试了 @BindingType@SOAPBinding 注释,这当然不起作用,然后我尝试了 SaajSoapMessageFactorySoapVersion.SOAP_12。没用。我在 jaxws-maven-plugin 中尝试了 <extension>true</extension><protocol>Xsoap1.2</protocol>。失败。

端点显然没有配置为接收 SOAP 1.2 消息。我该如何实现?

您发送的请求似乎命中了 SOAP 1.1 端点而不是 SOAP 1.2。

如果您的 WSDL 是使用自上而下的方法构建的,请确保 SOAP 1.2 的 SOAP 绑定存在于 wsdl 中。此外,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();

Please note the text in bold "new TestService().getTestPortSoap12()" is matching the name of the SOAP 1.2 port name in the wsdl.

或者在您的 Web 服务客户端配置中确保您使用的端点地址指向 SOAP 1.2 端口,例如,在我们的例子中,它是 http://127.0.0.1:8081/testSoap12Endpoint not http://127.0.0.1:8081/testSoap11Endpoint.

如果这些步骤失败,请分享 wsdl 片段(显示 wsdl:service 部分)和您的 @Configuration 网络服务 spring 配置。

我明白了。我需要在实现端点时设置绑定 url。由于某些不明显的原因,之后设置它不起作用。

EndpointImpl endpoint = new EndpointImpl(springBus(), statusService(), SOAPBinding.SOAP12HTTP_BINDING);