2012-01-30 12 views
12

Il mio obiettivo è quello di creare un client Web Service che viene eseguito in un vaso autonomo con tutte le dipendenze con il montaggio mvn: singleApache CXF client carica sottili in Eclipse, ma vaso standalone getta NullPointerException in WSDLServiceFactory

ho generato il client utilizzando CXF Codegen WSDL2Java, creando un @WebServiceClient chiamato NetBanxAutostatementService

per le dipendenze ho

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

disperatamente ho anche cercato di aggiungere più "roba"

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

Il problema: ogni volta che tenta di eseguire "java -jar bersaglio/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) 

Questo accade nella linea che invoca the WebServiceClient autostatementService = new NetBanxAutostatementService (autostatement_wsdlLocation); So dalla linea di registro che non sto passando autostatement_wsdlLocation nullo

codice 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

Possiamo anche il codice Java? – thatidiotguy

+0

NetBanxAutostatementService è una classe generata da CFX Posso anche aggiungerla. Questo codice funziona perfettamente con Eclipse, quindi credo che manchi qualche dipendenza da aggiungere al file JAR. Ho già provato ad aggiungere la configurazione di cxf.xml Spring ma ho ottenuto lo stesso errore. –

+0

Hmm, davvero non penso che sia un problema di caricamento di classe, perché questo ti darebbe un'eccezione ClassNotFound, non un puntatore nullo. Vedo che WSDLServiceFactory ha più di un argomento nei suoi costruttori, ma non dice che genererebbe un'eccezione nullpointer basata sulla documentazione qui: http://cxf.apache.org/apidocs/org/apache/cxf/wsdl11 /WSDLServiceFactory.html. Prova a scaricare il codice sorgente e guarda come 92 e vedere cosa lo causa. Sono fuori dai suggerimenti scusa. – thatidiotguy

risposta

17

Molto probabilmente si tratta di come si sta creando il vostro singolo barattolo. Un normale utilizzo del plug-in di assembly non lo consentirebbe poiché le varie parti di CXF META-INF/* avrebbero bisogno di essere unite insieme. Ciò includerebbe tutto il/META-INF/spring * e gran parte del materiale in/META-INF/cxf/* Suggerirei di usare il plugin per lo schermo per questo. Per un esempio, vedere pom.xml per il jar bundle di CXF.

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

+0

Come fa il plugin per lo schermo a sapere dove ottenere questo tipo di risorse? ' META-INF/wsdl.plugin.xml' –

+1

Passando al plug-in dell'ombra e aggiungendo tutto l'AppendingTransformer e XmlAppendingTransformer (s) dal pom.xml nel link ha risolto il mio problema. Credo che il colpevole era ' \t \t \t \t \t \t \t META-INF/wsdl.plugin .xml \t \t \t \t \t \t ' –

+0

Grazie, davvero salvato il culo! Basta notare, esattamente come da "AppendingTransformer" e "XmlAppendingTransformer" sopra sono le cose che vuoi, non il "PluginTransformer" o il "CXFAllTransformer" - ho fatto questo errore in un primo momento, il tuo progetto * probabilmente * non costruirà con quelli inclusi . Pace! – demaniak

3

Si dovrebbe provare con quello plug-in vaso, che ti permette di creare vasi super che sono pulite e totalmente autosufficiente

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

+1

Questo approccio funziona, ma volevo creare un jar con la mia classe come Main Class, non com.simontuffs.onejar.Boot –

15

Ampliando @ risposta di DanielKulp, che ha lavorato un trattare per me con CXF 2.7.7 (nel caso in cui il collegamento muore). Configurare il plug-in ombra con i seguenti trasformatori supplementari:

<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

Ho cercato una mezza giornata. Grazie mille! – ooxi

0

In complemento alla risposta di @ Matt R, ho sostituito la parte POM con l'esperto di montaggio-plugin con questo codice:

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

Il escludere parte è di evitare di avere problemi di sicurezza Java.