【问题标题】:CXF How to set SoapVersion on CXF port without SpringCXF 如何在没有 Spring 的 CXF 端口上设置 SoapVersion
【发布时间】:2011-05-13 23:35:08
【问题描述】:

我目前正在使用没有 Spring 配置文件的 CXF 开发 Web 服务客户端。

它工作得很好,但我不知道如何使用 Java Api 设置绑定 SoapVersion。 使用 Spring 文件执行以下操作:

<jaxws:binding>
    <soap:soapBinding version="1.2"/>
</jaxws:binding>

你们知道如何在 Java 代码中执行此操作(在端口上、在 SOAPBinding 上...)吗?

提前感谢您的帮助!

编辑----------

我仍然被这个问题困扰...... 我尝试按照以下响应之一中的建议在接口上添加 SOAPBinding 注释,但它没有工作...... 我仍在寻找一种方法来手动配置我的 PortType / Binding / Bus 以使用 Soap 1.2...

有什么想法吗?

编辑----------

问题解决了!其实我回答了我自己的问题:见下文...

谢谢!

【问题讨论】:

    标签: java configuration jax-ws cxf


    【解决方案1】:

    好的,我再次回答我自己的问题以分享解决方案。 在 CXF 邮件列表中的人的帮助下,我找到了适合我的解决方案。 实际上有两种方法可以解决这个问题。 解释如下:

    问题来自于我构建 CXF 服务的方式。

    第一种解决方案是在创建Service时指定WSDL位置:

    // Create the service
    Service service = Service.create(urlToWsdl, serviceQName);
    // Access the port
    return service.getPort(serviceQName, portTypeClass);
    

    这解决了问题,但我不想让那个链接到 WSDL,所以这是摆脱这个链接的第二个解决方案:

    // Create the service
    Service service = Service.create(serviceQName);
    // Add a Port to the service and specify the SOAP 1.2 binding
    service.addPort(serviceQName, javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING, wsUrl);
    // Access the port
    return service.getPort(serviceQName, portTypeClass);
    

    在我的项目中,我们决定选择第二种解决方案。

    希望这会有所帮助!

    【讨论】:

    • 我如何使用 cxf 来做到这一点?我正在创建这样的服务Object implementor = new DiscoveryLookupPortImpl(); Endpoint.publish("udp://239.255.255.250:3702", implementor);public class DiscoveryLookupPortImpl implements DiscoveryLookupPort
    【解决方案2】:

    最简单的可能是在以下界面上粘贴注释:

    @BindingType(SOAPBinding.SOAP12HTTP_BINDING)
    

    【讨论】:

    • @reef:你从哪里得到接口的描述?
    • @Donal Fellows 这是 wsdl2java 工具执行的结果。它基本上是我的项目依赖项之一。
    • @reef:这就是提出问题非常有用的事情。有什么方法可以让您转换的 WSDL 说它需要 SOAP 1.2? (我已经有一段时间没有修改 SOAP 的那部分了,所以我忘记了细节。)如果有,那肯定是信息应该去的地方吗?毕竟,如果这是服务所需要的,那么这就是它应该要求的……
    • @Donal Fellows 实际上,我通过将服务器配置为请求 SOAP 1.2 消息来解决问题。在客户端上使用 Soap 1.2 Porttype 效果很好。
    • @reef:酷。您应该提及您所做的事情作为答案,以便我们可以给您一些投票。 (真的!当你得到一个可以帮助他人的真实答案时,回答你自己的问题是完全可以的。)
    【解决方案3】:

    如果您使用的是 cxf 客户端,您可以使用以下方式。也可以绑定多个wsdl。

    JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
    factory.setServiceClass(WebServiceClass);
            BindingConfiguration config = new BindingConfiguration() {
    
        @Override
        public String getBindingId() {
                // TODO Auto-generated method stub
                return "http://www.w3.org/2003/05/soap/bindings/HTTP/";//SOAPVersion.SOAP_12.httpBindingId
        }
        };
        factory.setBindingConfig(config);
    

    【讨论】:

      【解决方案4】:

      根据 Donal Fellows 的建议,我回答自己的问题 ;)

      实际上,该问题与服务器可以处理的 Soap 版本有关。 在客户端,我不需要指定要使用 Soap 1.2,似乎将 WSDL 文件中的 PortType 配置为 Soap 1.2 就足够了。 但在服务器端,我需要明确告诉我想要哪个 Soap 版本。 在服务器端,我仍然使用“Spring-mode”进行 CXF 配置,因此我只是在 XML 配置文件中添加了以下内容:

      <jaxws:binding>
          <soap:soapBinding version="1.2"/>
      </jaxws:binding>
      

      这就是所有人! 感谢您的时间和帮助!

      编辑--------------------------------

      实际上,这个解决方案现在不起作用,因为我们联系了一个我们不管理的服务器......我们仍然在这里遇到我们的问题......

      【讨论】:

      • 好的,这个解决方案可以正常工作,因为我确实可以访问客户端和服务器端。现在我必须联系我不管理的服务器,这不起作用。你们知道如何在没有 Spring 配置的情况下设置 SOAP 版本吗?
      【解决方案5】:

      旧线程。我想我会发布一个对我有用的解决方案。 在 cxf-beans.xml 文件中,我将 endpointName="tns:MR_ServerSoap12"endpointName="tns:MR_ServerSoap" 更改为。请注意,端点名称将在您的 wsdl 中有自己的名称。使用该名称。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多