为什么wsdl2java生成的代码会随意使用CXF依赖?

时间:2015-06-01 09:53:00

标签: maven cxf jax-ws wsdl2java

我使用Apache CXF 3.0.4 // If asInterface isn't also a CustomerNew, the expression will set null CustomerNew asClass3 = asInterface as CustomerNew; 使用以下命令从this wsdl生成代码:

wsdl2java

据我所知./wsdl2java -client -exsh true -d weather -p weather -verbose url 仅使用JAX-WS生成纯Java代码。生成的代码工作正常,没有任何额外的库/依赖项。我已经试图找到任何CXF类,但似乎没有CXF。当我向wsdl2java添加特定的CXF依赖项时,问题就会消失。这种依赖是:

pom.xml

添加之后,应用程序似乎使用了JAX-WS的不同实现(甚至可能吗?)。

生成的代码包含<dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>3.1.0</version> </dependency> 接口等。其中一种方法是WeatherSoap

getWeatherInformation()

没有@WebService(targetNamespace = "http://ws.cdyne.com/WeatherWS/", name = "WeatherSoap") @XmlSeeAlso({ObjectFactory.class}) public interface WeatherSoap { /** * Gets Information for each WeatherID */ @WebResult(name = "GetWeatherInformationResult", targetNamespace = "http://ws.cdyne.com/WeatherWS/") @RequestWrapper(localName = "GetWeatherInformation", targetNamespace = "http://ws.cdyne.com/WeatherWS/", className = "weather.GetWeatherInformation") @WebMethod(operationName = "GetWeatherInformation", action = "http://ws.cdyne.com/WeatherWS/GetWeatherInformation") @ResponseWrapper(localName = "GetWeatherInformationResponse", targetNamespace = "http://ws.cdyne.com/WeatherWS/", className = "weather.GetWeatherInformationResponse") public weather.ArrayOfWeatherDescription getWeatherInformation(); ... } 依赖

  1. 进入cxf-rt-frontend-jaxws,同时调试导致getWeatherInformation()(另一个生成的类。
  2. 步入GetWeatherInformation会导致GetWeatherInformation
  3. ...
  4. 收到SOAP webservice的结果。
  5. com.oracle.webservices.internal.api.message.BasePropertySet依赖

    1. 步入cxf-rt-frontend-jaxws,同时调试导致getWeatherInformation(为什么?)
    2. ...
    3. 抛出异常:
    4. org.apache.cxf.jaxws.JaxWsClientProxy

      我知道此异常有一个解决方法,提到here并且它有效。但不是我的工作申请。毕竟它会抛出NPE:

      Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: Could not find conduit initiator for address: http://wsf.cdyne.com/WeatherWS/Weather.asmx and transport: http://schemas.xmlsoap.org/soap/http
          at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:161)
          at com.sun.proxy.$Proxy33.getWeatherInformation(Unknown Source)
          at weather.WeatherSoap_WeatherSoap_Client.main(WeatherSoap_WeatherSoap_Client.java:49)
      Caused by: java.lang.RuntimeException: Could not find conduit initiator for address: http://wsf.cdyne.com/WeatherWS/Weather.asmx and transport: http://schemas.xmlsoap.org/soap/http
          at org.apache.cxf.binding.soap.SoapTransportFactory.getConduit(SoapTransportFactory.java:224)
          at org.apache.cxf.binding.soap.SoapTransportFactory.getConduit(SoapTransportFactory.java:229)
          at org.apache.cxf.endpoint.AbstractConduitSelector.createConduit(AbstractConduitSelector.java:145)
          at org.apache.cxf.endpoint.AbstractConduitSelector.getSelectedConduit(AbstractConduitSelector.java:107)
          at org.apache.cxf.endpoint.UpfrontConduitSelector.prepare(UpfrontConduitSelector.java:63)
          at org.apache.cxf.endpoint.ClientImpl.prepareConduitSelector(ClientImpl.java:853)
          at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:511)
          at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:425)
          at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:326)
          at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:279)
          at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
          at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:139)
          ... 2 more
      

      提问时间

      1. 为什么在没有它的情况下应用程序正常工作时会使用Apache-CXF?
      2. 在这种情况下是否可以强制应用程序停止使用Apache-CXF?
      3. 我不需要客户端的这种依赖关系(因为没有它们它可以正常工作)。我只想生产SOAP。这就是为什么我需要这种依赖。我看到的唯一解决方案是将应用程序拆分为单独的消费者和生产者。

1 个答案:

答案 0 :(得分:1)

  

应用程序似乎使用了JAX-WS的不同实现(甚至可能吗?)。

是。 CXF拥有它自己的jax-ws提供程序,它的jar包含一个声明它的服务文件。 (当JVM需要一个jax-ws提供者时:它在类路径上查看是否有一个非默认提供者声明...而是否有使用它)。

为什么? 这是Java规范:http://docs.oracle.com/javaee/5/api/javax/xml/ws/spi/Provider.html#provider()

  

在这种情况下是否可以强制应用程序停止使用Apache-CXF?

是。在类路径上创建适当的资源文件以重定向到默认实现。

详细信息:文件必须在此处:META-INF/services/javax.xml.ws.spi.Provider(如果您使用maven:只需将其放在此处:/src/main/resources/META-INF/services/javax.xml.ws.spi.Provider

它必须包含一行:

javax.xml.ws.spi.Provider