【问题标题】:How do I make JAX-WS endpoint accept SOAP1.2 messages如何让 JAX-WS 端点接受 SOAP1.2 消息
【发布时间】:2016-11-09 12:49:39
【问题描述】:

我有一个基于 Spring Boot 的项目,使用 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 类中,我将它添加到 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 spring-boot wsdl cxf jax-ws


    【解决方案1】:

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

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

    【讨论】:

      【解决方案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();
      

      请注意粗体中的文字“新 TestService().getTestPortSoap12()" 与 wsdl 中的 SOAP 1.2 端口名称

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

      如果这些步骤失败,请分享 wsdl sn-p(显示 wsdl:service 部分)和您的 @Configuration Web 服务 spring 配置。

      【讨论】:

      • 这不是我的问题。正如我在原来的帖子中所说,我确实拥有适用于 SOAP 1.2 的正确绑定和命名空间。我还提到使用扩展元素没有成功。但是,我自己解决了这个问题。看我的回答。
      猜你喜欢
      • 2012-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      • 2011-04-28
      相关资源
      最近更新 更多