Zum Inhalt

SOAP Webservice mit JDK > 11 und Spring-Boot 2

Ausgangsbasis ist eine einfache WSDL: https://www.tutorialspoint.com/wsdl/wsdl_example.htm, ein als Basisframework Spring-Boot 2. Als Entwicklungsumgebung wählen ich JDK11. Um sich das Leben „zu erleichtern“ wird die Abhängigkeit „spring-boot-devtools“ eingebunden

<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>2.1.8.RELEASE</version>
   <relativePath/>
</parent>

Zum generieren der Java Klassen für den Webservice verwende ich das CXF Plugin:

<plugin>
   <groupId>org.apache.cxf</groupId>
   <artifactId>cxf-codegen-plugin</artifactId>
   <version>3.3.3</version>
   <executions>
      <execution>
         <id>generate-sources</id>
         <phase>generate-sources</phase>
         <configuration>
            <sourceRoot>${project.build.directory}/generated-sources/cxf</sourceRoot>
            <wsdlOptions>
               <wsdlOption>
                  <extraargs>
                     <extraarg>-p</extraarg>
                     <extraarg>http://eugen-krotov.de/=me.ek.example.soap</extraarg>
                  </extraargs>
                  <wsdl>${basedir}/src/main/resources/MyWebservice.wsdl</wsdl>
               </wsdlOption>
            </wsdlOptions>
         </configuration>
         <goals>
            <goal>wsdl2java</goal>
         </goals>
      </execution>
   </executions>
</plugin>

Der zusätzliche Pfad wird mit dem build-helper-maven-plugin eingebunden:

<plugin>
   <groupId>org.codehaus.mojo</groupId>
   <artifactId>build-helper-maven-plugin</artifactId>
   <version>1.7</version>
   <executions>
      <execution>
         <id>add-source</id>
         <phase>generate-sources</phase>
         <goals>
            <goal>add-source</goal>
         </goals>
         <configuration>
            <sources>
               <!--source>target/generated-sources/wsimport</source-->
               <source>target/generated-sources/cxf</source>
            </sources>
         </configuration>
      </execution>
   </executions>
</plugin>

Damit die erzeugen Kassen kompilierbar werden, brauchen wir noch folgende Abhängigkeiten (eigentlich bin ich davon ausgegangen, dass Spring diese Abhängigkeiten bereits transitiv zur Verfügung stellt, wenn man den webservices Modul einbinden, aber evtl habe ich beim Lesen der Spring Doku etwas übersehen. Ich musste jedenfalls die Abhängigkeiten hinzufügen):

<dependency>
   <groupId>com.sun.xml.ws</groupId>
   <artifactId>jaxws-ri</artifactId>
   <version>2.3.2</version>
   <type>pom</type>
</dependency>

<dependency>
   <groupId>javax.xml.bind</groupId>
   <artifactId>jaxb-api</artifactId>
   <version>2.3.1</version>
</dependency>

Die einzelnen Klassen werde ich hier nicht ausimplementieren, daher ist jetzt ein wenig Phantasie bzw. eigener Fleiß gefragt. Mit dem Aufruf der Applikation innerhalb des Maven Kontextes startet ihr die Applikation

mvn spring-boot:run

In Abhängigkeit davon wie man den Aufruf des Webservices implementiert, bekommt zum Zeitpunkt des Aufrufs eine IllegalArgumentException präsentiert, die man nicht zu sehen bekommt, wenn der Service innerhalb eines Unit Tests aufgerufen wird.

Beim Nachbohren wird man über kurz oder Lang zu der JDK Klasse „Proxy“ gelangen und zwar zu dieser Stelle/Methode:

private static void ensureVisible(ClassLoader ld, Class<?> c) {
    Class type = null;

    try {
        type = Class.forName(c.getName(), false, ld);
    } catch (ClassNotFoundException var4) {
    }

    if (type != c) {
        throw new IllegalArgumentException(c.getName() + " referenced from a method is not visible from class loader");
    }
}

Die IllegalArgumentException wird also geworfen, weil der Parameter c nicht mit dem ausgelesenen type Wert übereinstimmt. Wenn man noch etwas tiefer reinbohrt, dann sieht man, dass der Klassenname gleich ist, aber hinter den geladenen Klassen unterschiedliche Classloader stehen.

type => AppClassLoader
c => RestartClassLoader –> und dieser Classloader gehört zu den Spring-boot-Devtools.

Entfernt man also die Devtools als Abhängigkeit aus dem Projekt, verschwindet auch der Fehler.

Published inUncategorized

Schreibe den ersten Kommentar

    Schreibe einen Kommentar

    Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

    Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.