Service wirft einen Nullpointer

tanechka

Bekanntes Mitglied
Hallo,

in dem Projekt wurden die Klassen mit Hilfe von Maven aus der Wsdls generiert. Im Projekt läuft auch alles über Run, der SOAP-Service ist auch erreichbar. Sobald aber ich meine .jar generiere und in der Console ausführe, gibt es eine Nullpointer Exception.
Meine dependencies:
Code:
        <dependency>
   <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>${cxf.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>${cxf.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http-jetty</artifactId>
            <version>${cxf.version}</version>
        </dependency>
....
    <resources>
            <resource>
                <directory>src/main/resources</directory>
                <excludes>
                    <exclude>**/*.java</exclude>
                </excludes>
            </resource>

........
<plugin>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-codegen-plugin</artifactId>
                <version>${cxf.version}</version>
                <executions>
                    <execution>
                        <id>generate-sources</id>
                        <phase>generate-sources</phase>
                        <configuration>                                                   
                            <sourceRoot>${basedir}/k_generated</sourceRoot>
                              <wsdlDirectory>src/main/resources/K/</wsdlDirectory>
                            
                            <wsdlOptions>
                                <wsdlOption>
                                    <wsdl>${basedir}/src/main/resources/K/KService.wsdl</wsdl>            
                                      <wsdlLocation>/K/KService.wsdl</wsdlLocation>                                                 
                                </wsdlOption>
                                 <wsdlOption>
                                    <wsdl>${basedir}/src/main/resources/K/KEventService.wsdl</wsdl>
                                      <wsdlLocation>/K/KService.wsdl</wsdlLocation>                                          
                                </wsdlOption>
                            </wsdlOptions>
                            </configuration>
                        <goals>
                            <goal>wsdl2java</goal>
                        </goals>
                    </execution>
                
                </executions>
            </plugin>
Parallel zu meiner .jar liegt der Ordner /K mit den .wsdls.
An sich ist es alles da, könntet ihr mir bitte weiter helfen?
Danke
 
Wie wäre es, wenn Du uns noch mehr relevante Details gibst:
  • Kompletter Stacktrace
  • den dazugehörigen Code inc. Hinweisen zu Zeilennummern, falls Du nur Ausschnitte bringen solltest
 
ich habe den Fehler bei dem Aufruf vom SOAP-Service abgefangen und geloggt:
Code:
try {
        
            service = new KService();
            service.setHandlerResolver(new WsHandlerResolver());
      
        } catch (Exception e) {
            logger.error("Der Fehler ist aufgetreten: " + e);
        }
Ich vermute, dass etwas mit den Pfaden zu den .wsdls nicht hinhaut.
Ich habe die relativen Pfade benutzt:
Code:
@WebServiceClient(name = "KService",
                  wsdlLocation = "/K/KService.wsdl",
                  targetNamespace = "http://ta-de.net")
public class KService extends Service {
Die wsdls liegen parallel zu der jar in dem K-Ordner. Ich habe auch classpath: versucht zu benutzen und auch leider ohne Erfolg.
 
wsdlLocation ist eine URL, wenn ich nach WebServiceClient (Java Platform SE 8 ) (oracle.com) gehe.

Mit /K/KService.wsdl gibst Du einen absoluten Pfad an. Das hört sich also schon falsch an. Da wäre ein ./K/KService.wsdl vermutlich besser.
Wobei das auch nur funktioniert, wenn der Pfad richtig ist beim Start der jar. Das ist teilweise nicht der Fall. Ich meine, bei einem Doppelclick ist das Arbeitsverzeichnis unter Windows teilweise das System32 Verzeichnis und so ... Oder bei einem java -jar Aufruf kann die jar Datei ja mit Pfad angegeben werden ...
 
ich habe jetzt mehr Info zu dem Nullpointer:
Code:
java.lang.NullPointerException
    at org.apache.cxf.wsdl11.WSDLServiceFactory.<init>(WSDLServiceFactory.java:85)
    at org.apache.cxf.jaxws.ServiceImpl.initializePorts(ServiceImpl.java:217)
    at org.apache.cxf.jaxws.ServiceImpl.initialize(ServiceImpl.java:160)
    at org.apache.cxf.jaxws.ServiceImpl.<init>(ServiceImpl.java:128)
    at org.apache.cxf.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:82)
    at javax.xml.ws.Service.<init>(Service.java:82)
wsdlLocation enthält den Pfad zu der SOAP-wsdl.
 
Just my 2 cents, ohne die Library praktisch zu kennen ...

Mit Blick auf die Implementierung kann man es zumindest auf 2 grundlegende Möglichkeiten einschränken was da null gewesen sein könnte.

Wobei diese Library bis jetzt auch einen eher durchwachsenen ersten Eindruck auf mich macht. Das Null-Handling ist an dieser Stelle (und nach Überfliegen des Codes wohl auch insgesamt) recht verbesserungswürdig, und an anderer Stelle war vor kurzem ja auch die praktisch nicht vorhandene Dokumentation elementarer Felder (und die daraus resultierende Notwendigkeit für Reverse Engineering) unangenehm aufgefallen.
 
Also wenn es an fehlenden Abhängigkeiten liegt, dann musst Du dafür sorgen, dass alle notwendigen Abhängigkeiten beim Start vorhanden sind. Dabei gibt es viele Wege, wie Du hier vorgehen kannst:
  • Im Manifest kannst Du einen classpath mit angeben und die Abhängigkeiten müssen dann entsprechend mit vorhanden sein.
  • Du kannst alles, was Du brauchst, auch mit in das jar File packen.

Wenn Du alles in ein fat jar packen willst, dann musst Du aber auch aufpassen, das alle Mechanismen wie hier der vo Service Loader, funktionieren. Ich erstelle FAT Jars in Maven immer mit dem Shade Plugin, denn dieser bietet auch den ServicesResourceTransformer an:
Apache Maven Shade Plugin – Usage
 
die Lösung für mein Problem war die shaded jar, jar mit dependency(maven-assembly-plugin) hat an der Stelle nicht ausgereicht.
Code:
      <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.1</version>
             <configuration>
        <createDependencyReducedPom>false</createDependencyReducedPom>
    </configuration>
            <executions>
              <execution>
                <phase>package</phase>
                <goals>
                  <goal>shade</goal>
                </goals>
                <configuration>
                                   <filters>
                    <filter>
                        <artifact>*:*</artifact>
                        <excludes>
                            <exclude>META-INF/*.SF</exclude>
                            <exclude>META-INF/*.DSA</exclude>
                            <exclude>META-INF/*.RSA</exclude>
                        </excludes>
                    </filter>          
                           
                </filters>
                  <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                     <manifestEntries>
                     <mainClass>......</mainClass>
                      <Multi-Release>true</Multi-Release>
                       </manifestEntries>
                    </transformer>
                      <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
       
                  </transformers>                             
                </configuration>
              </execution>
            </executions>            
          </plugin>
 

Zurück
Oben