2012-01-30 19 views
12

Mi objetivo es crear un cliente de servicios Web que se ejecuta en un frasco independiente con todas las dependencias utilizando el montaje mvn: solacargas cliente Apache CXF finas en Eclipse, pero frasco independiente NullPointerException en WSDLServiceFactory

me genera el cliente utilizando CXF wsdl2java CODEGEN, creando un @WebServiceClient llamada NetBanxAutostatementService

para las dependencias que tengo

<cxf.version>2.5.2</cxf.version> 
</properties> 
<dependencies> 
    <dependency> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-rt-frontend-jaxws</artifactId> 
     <version>${cxf.version}</version> 
     <scope>runtime</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-rt-transports-http</artifactId> 
     <version>${cxf.version}</version> 
     <scope>runtime</scope> 
    </dependency> 

desesperadamente incluso intentado añadir más "cosas"

<dependency> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-rt-core</artifactId> 
     <version>2.5.2</version> 
     <scope>runtime</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf</artifactId> 
     <version>2.5.2</version> 
     <type>pom</type> 
     <scope>runtime</scope> 
    </dependency> 

El problema: cada vez que intento ejecutar "java-jar de destino/Netbanx-0.0.1-SNAPSHOT-jar-con-dependencies.jar"

INFO [main] (Netbanx.java:97) - autostatement_wsdlLocation:https://www.test.netbanx.com/cgi-bin/autostatement_wsdl 
Exception in thread "main" java.lang.NullPointerException 
at org.apache.cxf.wsdl11.WSDLServiceFactory.<init>(WSDLServiceFactory.java:92) 
at org.apache.cxf.jaxws.ServiceImpl.initializePorts(ServiceImpl.java:204) 
at org.apache.cxf.jaxws.ServiceImpl.<init>(ServiceImpl.java:148) 
at org.apache.cxf.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:91) 
at javax.xml.ws.Service.<init>(Service.java:56) 
at com.netbanx.autostatement.NetBanxAutostatementService.<init> (NetBanxAutostatementService.java:39) 
at my.project.netbanx.Netbanx.<init>(Netbanx.java:98) 
at my.project.netbanx.Netbanx.main(Netbanx.java:130) 

Esto sucede en la línea que llama WebServiceClient autostatementService = new NetBanxAutostatementService (autostatement_wsdlLocation); sé por la línea de registro que no estoy pasando autostatement_wsdlLocation como nulo

código Java:

URL autostatement_wsdlLocation = null; 
URL payment_wsdlLocation = null; 
try { 
    autostatement_wsdlLocation = new URL(properties.getProperty("autostatement_wsdlLocation")); 
    payment_wsdlLocation = new URL(properties.getProperty("payment_wsdlLocation")); 
} catch (MalformedURLException e) { 
    logger.error("MalformedURLException",e); 
} 

    /** 
    * Load the Netbanx's webservices AutostatementService and PaymentService 
    */ 
try {   
    logger.info("autostatement_wsdlLocation:"+autostatement_wsdlLocation.toString()); 
    autostatementService = new NetBanxAutostatementService(autostatement_wsdlLocation); //it is here I get the NullPointerException error 
    logger.info("payment_wsdlLocation:"+payment_wsdlLocation.toString()); 
    paymentService = new NetBanxPaymentService(payment_wsdlLocation); 
webServiceStarted = true; 
    } catch(javax.xml.ws.WebServiceException wsException){ 
     String error = "Cannot create NetBanx web service please make sure this host can reach:" + autostatement_wsdlLocation +" and " + payment_wsdlLocation; 
     logger.error(error); 
     logger.error("WebServiceException",wsException); 

}

+0

¿Podríamos el código de Java también? – thatidiotguy

+0

NetBanxAutostatementService es una clase generada por CFX. Puedo agregarla también. Este código funciona bien en Eclipse, así que supongo que me falta algo de dependencia para agregarlo al archivo JAR. Ya intenté agregar la configuración cxf.xml Spring, pero obtuve el mismo error. –

+0

Hmm, realmente no creo que sea un problema de carga de clases, porque eso le daría una excepción ClassNotFound, no un puntero nulo. Veo que WSDLServiceFactory tiene más de un argumento en sus constructores, pero no dice que lanzarían una excepción nullpointer basada en la documentación aquí: http://cxf.apache.org/apidocs/org/apache/cxf/wsdl11 /WSDLServiceFactory.html. Intente descargar el código fuente y mire 92 y vea qué lo causa. Im de sugerencias lo siento. – thatidiotguy

Respuesta

17

Lo más probable es cómo va a crear su frasco único. Un uso normal del plugin de ensamblaje no lo permitiría ya que varias partes de CXF META-INF/* deberían fusionarse. Eso incluiría todo/META-INF/primavera * y muchas de las cosas en/META-INF/cxf/* Yo sugeriría usar el plugin de sombra para eso. Vea el pom.xml para el paquete jar de CXF para ver un ejemplo.

http://svn.apache.org/repos/asf/cxf/trunk/osgi/bundle/all/

+0

¿Cómo sabe el plugin de sombra dónde obtener este tipo? de recursos? ' META-INF/wsdl.plugin.xml' –

+1

Cambiando al plugin de sombreado y agregando todo el AppendTransformer y XmlAppendingTransformer (s) del pom.xml en el enlace resolvió mi problema. Creo que el culpable era ' \t \t \t \t \t \t \t META-INF/wsdl.plugin .xml \t \t \t \t \t \t ' –

+0

Gracias, esto realmente salvó mi culo! Solo tenga en cuenta, exactamente como a partir de lo anterior "AppendTransformer" y "XmlAppendingTransformer" es lo que desea, no el "PluginTransformer" o el "CXFAllTransformer" - Cometí ese error al principio, su proyecto * probablemente * no se compilará con los incluidos . ¡Paz! – demaniak

3

Usted debe tratar con el plug-in frasco, que vamos a crear súper frascos que están limpios y totalmente autónomo

http://code.google.com/p/onejar-maven-plugin/

+1

Este enfoque funciona, pero quería crear un jar con mi clase siendo la clase principal no la com.simontuffs.onejar.Boot –

15

Ampliando @ respuesta de DanielKulp, que trabajó una trátame con CXF 2.7.7 (solo en caso de que el enlace muera). Configurar el plugin de sombra con los siguientes transformadores adicionales:

<configuration> 
    <transformers> 
    <!-- transformers for CXF (see http://stackoverflow.com/a/9069435/61298) --> 
    <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
     <resource>META-INF/spring.handlers</resource> 
    </transformer> 
    <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
     <resource>META-INF/services/com.sun.tools.xjc.Plugin</resource> 
    </transformer> 
    <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
     <resource>META-INF/spring.schemas</resource> 
    </transformer> 
    <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
     <resource>META-INF/cxf/cxf.extension</resource> 
    </transformer> 
    <transformer implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer"> 
     <resource>META-INF/extensions.xml</resource> 
    </transformer> 
    <transformer implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer"> 
     <resource>META-INF/cxf/extensions.xml</resource> 
    </transformer> 
    <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
     <resource>META-INF/cxf/bus-extensions.txt</resource> 
    </transformer> 
    <transformer implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer"> 
     <resource>META-INF/cxf/bus-extensions.xml</resource> 
    </transformer> 
    <transformer implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer"> 
     <resource>META-INF/wsdl.plugin.xml</resource> 
    </transformer> 
    <transformer implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer"> 
     <resource>META-INF/tools.service.validator.xml</resource> 
    </transformer> 
    <transformer implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer"> 
     <resource>META-INF/cxf/java2wsbeans.xml</resource> 
    </transformer> 
    </transformers> 
</configuration> 
+0

Busqué como medio día. ¡Muchas gracias! – ooxi

0

En complemento a la respuesta de @ Matt R, I sustituye la parte POM con la experta en montaje-plugin con este código:

<plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <version>2.3.2</version> 
      <configuration> 
       <archive> 
        <manifest> 
         <addClasspath>true</addClasspath> 
         <mainClass>com.xxx.App</mainClass> 
        </manifest> 
       </archive> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>3.0.0</version> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <transformers> 
          <!-- transformers for CXF (see http://stackoverflow.com/a/9069435/61298) --> 
          <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
           <resource>META-INF/spring.handlers</resource> 
          </transformer> 
          <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
           <resource>META-INF/services/com.sun.tools.xjc.Plugin</resource> 
          </transformer> 
          <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
           <resource>META-INF/spring.schemas</resource> 
          </transformer> 
          <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
           <resource>META-INF/cxf/cxf.extension</resource> 
          </transformer> 
          <transformer implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer"> 
           <resource>META-INF/extensions.xml</resource> 
          </transformer> 
          <transformer implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer"> 
           <resource>META-INF/cxf/extensions.xml</resource> 
          </transformer> 
          <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
           <resource>META-INF/cxf/bus-extensions.txt</resource> 
          </transformer> 
          <transformer implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer"> 
           <resource>META-INF/cxf/bus-extensions.xml</resource> 
          </transformer> 
          <transformer implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer"> 
           <resource>META-INF/wsdl.plugin.xml</resource> 
          </transformer> 
          <transformer implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer"> 
           <resource>META-INF/tools.service.validator.xml</resource> 
          </transformer> 
          <transformer implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer"> 
           <resource>META-INF/cxf/java2wsbeans.xml</resource> 
          </transformer> 
         </transformers> 
         <filters> 
          <filter> 
           <artifact>*:*</artifact> 
           <excludes> 
            <exclude>META-INF/*.SF</exclude> 
            <exclude>META-INF/*.DSA</exclude> 
            <exclude>META-INF/*.RSA</exclude> 
           </excludes> 
          </filter> 
         </filters> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 

La excluir parte es evitar tener problemas de seguridad de Java.

Cuestiones relacionadas