为什么WSDL2Java的生成代码使用CXF的依赖关系的意愿?(Why wsdl2java gene

2019-10-23 06:16发布

我使用Apache CXF 3.0.4 wsdl2java从生成代码这个WSDL使用下面的命令:

./wsdl2java -client -exsh true -d weather -p weather -verbose url

据我知道wsdl2java只用JAX-WS生成纯Java代码。 生成的代码工作正常,没有任何附加的库/依赖。 我grepped它找到任何CXF类,但它似乎是从CXF免费。 当我添加特定CXF依赖于我的问题流出pom.xml 。 这种依赖是:

<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxws</artifactId>
    <version>3.1.0</version>
</dependency>

加入之后,应用似乎使用不同的实现JAX-WS的(它甚至有可能?)。

生成的代码包含了除其他事项外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();

...

}

如果没有cxf-rt-frontend-jaxws依赖

  1. 一步进入getWeatherInformation()同时调试导致GetWeatherInformation (另一个生成的类。
  2. 步入GetWeatherInformation导致com.oracle.webservices.internal.api.message.BasePropertySet
  3. ...
  4. 从SOAP Web服务的结果收到。

随着cxf-rt-frontend-jaxws依赖

  1. 走进getWeatherInformation同时调试导致org.apache.cxf.jaxws.JaxWsClientProxy (为什么?)
  2. ...
  3. 抛出异常:
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

我知道,有办法解决这个例外,其中提到这里和它的作品。 但不适合我的工作中的应用。 它抛出NPE毕竟:

Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: java.lang.NullPointerException
    ...
Caused by: org.apache.cxf.binding.soap.SoapFault: java.lang.NullPointerException
    at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:86)
    at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:52)
    at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:41)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
    at org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:113)
    at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)
    at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
    at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:802)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1642)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1533)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1336)
    at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
    at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:652)
    at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
    at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:516)
    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)
    ... 7 more

提问时间

  1. 为什么当应用程序工作正常,没有它Apache的CXF甚至使用?
  2. 是否有可能迫使应用程序停止在这种情况下,使用Apache的CXF?

我不需要这种依赖客户端(因为它工作正常,没有他们)。 我只是想产生SOAP为好。 而这就是为什么我需要这个依赖。 这是我看到的唯一的解决方案是应用程序分成单独的消费者和生产者。

Answer 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?

是。 建立在classpath相应的资源文件重定向到默认的实现。

在细节:文件必须在这里: 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


文章来源: Why wsdl2java generated code use CXF dependencies at will?