Je dois générer un client WS et je ne peux pas décider quel plugin utiliser. Jusqu'à présent, mes options sont: jaxb2-maven-plugin, axistools-maven-plugin et jaxws-maven-plugin.
Je dois générer un client WS et je ne peux pas décider quel plugin utiliser. Jusqu'à présent, mes options sont: jaxb2-maven-plugin, axistools-maven-plugin et jaxws-maven-plugin.
Tout d’abord, lejaxb2-maven-plugin
n’est pas vraiment destiné à générer des clients WS. ÉLIMINÉ.
Deuxièmement, personnellement, je n’utiliserais pas Axis même pour le développement client , je ne recommanderais donc pas l’utilisation deaxistools-maven-plugin
. ÉLIMINÉ.
Cela nous laisse les piles JAX-WS RI et Apache CXF, ainsi que leurs plug-ins Maven respectifs: le plugin Maven JAX-WS (les instructions d'utilisation du plug-in Maven JAX-WS se trouvent sur le site Usage et le cxf-codegen-plugin .
En ce qui concerne les avantages et les inconvénients, je les résumerais ainsi:
À la fin, les deux choix sont corrects alors je suggère de parcourir les liens un peu et de donner votre propre opinion.
J'utilise jaxws-maven-plugin. A mon avis, JAX-WS est l'implémentation standard de facto pour WS. Il a un code généré bien meilleur qu'AXIS, et plus facile à configurer et à mettre en œuvre. Il a un support Maven et Spring.
Génération de code côté client à partir d'un fichier wsdl, dans pom.xml:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<executions>
<execution>
<id>generate-reports-ws-code</id>
<phase>generate-sources</phase>
<goals>
<goal>wsimport</goal>
</goals>
<configuration>
<!-- This property is used to support having multiple <execution> elements. The plugin has, from some reason, only one timestamp file per the all executions, thus if you have two executions, it doesn't know exactly when to recompile the code. Here we tell it explicitly to have one timestamp file per each execution --> <staleFile>${project.build.directory}/jaxws/stale/.staleFlag.reports</staleFile>
<packageName>com.acme.reports.ws.api</packageName>
<wsdlDirectory>${project.build.directory}/wsdl</wsdlDirectory>
<wsdlFiles>
<wsdlFile>InternalReportsAPIService.wsdl</wsdlFile>
</wsdlFiles>
<verbose>true</verbose>
<sourceDestDir>${wsdl.generated.source.files.dir}</sourceDestDir>
</configuration>
</execution>
</executions>
</plugin>
Une interface pour créer le bean de service client (celui-ci n'est pas généré automatiquement):
public interface InternalReportsAPIServiceFactory {
public InternalReportsAPIService createInternalReportsAPIService();
}
Son implémentation Bean:
public class InternalReportsAPIServiceFactoryBean implements InternalReportsAPIServiceFactory {
private URL acmeReportsWsdlURL;
private final static QName V1_QNAME = new QName("http://internal.reports.api.acme.net/v1","InternalReportsAPIService");
@Override
public InternalReportsAPIService createInternalReportsAPIService() {
return new InternalReportsAPIService(acmeReportsWsdlURL, V1_QNAME);
}
public void setAcmeReportsWsdlUrl(String acmeReportsWsdlUrl) {
try {
this.acmeReportsWsdlURL = new URL(acmeReportsWsdlUrl);
} catch (MalformedURLException ex) {
throw new RuntimeException("Acme Reports WSDL URL is bad: "+ex.getMessage(), ex);
}
}
}
L'idée dans ce haricot (utilisé comme bean Spring) est d'avoir un singleton pour générer un code de service client. Il nécessite deux entrées: L'URL WSDL - c'est-à-dire l'URL réelle du serveur qui implémente le WSDL. Lors de la construction, le code de service client envoie une demande d’obtention du WSDL à l’URL fournie. Il crée ensuite le WSDL en fonction des annotations résidant dans le code généré automatiquement et le compare. Je pense que ceci est fait pour vous assurer que vous utilisez la version de serveur correcte. J'ai donc placé l'URL dans un fichier de propriétés accessible à mon application, c'est pourquoi je l'initialise dans mon fichier de contexte d'application Spring.
Voici un exemple d'utilisation de la fabrique pour générer un service, puis de l'utiliser:
InternalReportsAPIService internalReportsAPIService = acmeReportsWSFactory.createInternalReportsAPIService();
InternalReportsAPI port = internalReportsAPIService.getInternalReportsAPIPort();
À partir de là, utilisez simplement la variable port pour appeler toute opération disponible sur le fichier wsdl.
Plugins Maven requis:
JAX-WS to WSDL Pour générer le document WSDL à partir de la classe annotée JAX-WS en configurant cxf-Java2ws-plugin avec l’objectif ‘Java2ws’.
Ajoutez la dépendance cxf-rt-frontend-jaxws et les dépendances de projet requises pour la classe annotée JAX-WS en tant que dépendances de plug-in.
<plugin>
<groupId>org.Apache.cxf</groupId>
<artifactId>cxf-Java2ws-plugin</artifactId>
<version>2.5.1</version>
<dependencies>
<dependency>
<groupId>org.Apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>2.5.1</version>
</dependency>
<dependency>
<groupId>com.medici.app</groupId>
<artifactId>services</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<className>com.medici.app.services.WebServiceBean</className>
<genWsdl>true</genWsdl>
</configuration>
<goals>
<goal>Java2ws</goal>
</goals>
</execution>
</executions>
</plugin>
WSDL 2 Java Pour générer le client Java à partir du document WSDL en configurant cxf-codegen-plugin avec l’objectif ‘wsdl2Java’.
L’argument ‘-p’ spécifie les classes de package.
Les classes générées seront placées dans le dossier target/généré-sources/cxf.
<plugin>
<groupId>org.Apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>2.5.1</version>
<executions>
<execution>
<id>process-sources</id>
<phase>generate-sources</phase>
<configuration>
<wsdlOptions>
<wsdlOption>
<wsdl>${project.build.directory}/wsdl/WebService.wsdl</wsdl>
<extraargs>
<extraarg>-p</extraarg>
<extraarg>com.medici.app.client.model</extraarg>
</extraargs>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2Java</goal>
</goals>
</execution>
</executions>
</plugin>