2011-01-03 3 views
0

Ayant couru dans http://java.net/jira/browse/JAXB-131, nous essayons d'adopter le traitement fourni dans ses commentaires, qui est de fournir -enableIntrospection sur la ligne de commande de xjc.Utilisation de -enableIntrospection de xjc avec jaxws-maven-plugin

Cependant, quand je fais:

 <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>jaxws-maven-plugin</artifactId> 
      <version>1.12</version> 
      <executions> 
       <execution> 
        <id>allservice</id> 
        <goals> 
         <goal>wsimport</goal> 
        </goals> 
        <configuration> 
         <xjcArgs><xjcArg>-enableIntrospection</xjcArg></xjcArgs> 
         <extension>true</extension> 
         <wsdlDirectory>src/main/webapp/WEB-INF/wsdl</wsdlDirectory> 
         <bindingDirectory>src/main/resources/bindings</bindingDirectory> 
         <target>2.0</target> 
        </configuration> 
       </execution> 
      </executions> 
      <dependencies> 
       <dependency> 
        <groupId>javax.jws</groupId> 
        <artifactId>jsr181-api</artifactId> 
        <version>1.0</version> 
       </dependency> 
      </dependencies> 
     </plugin> 

Le build Maven échoue avec:

[DEBUG] The binding Directory is C:\Source\workspace\TheProject\src\main\resources\bindings 
[DEBUG] jaxws:wsimport args: [-s, C:\Source\workspace\TheProject\target\jaxws\wsimport\java, -d, C:\Source\workspace\TheProject\target\classes, -target, 2.0, -extension, -Xnocompile, -B-enableIntrospection, -b, C:\Source\workspace\TheProject\src\main\resources\bindings\servicebindings.xml] 
[INFO] jaxws:wsimport args: [-s, C:\Source\workspace\TheProject\target\jaxws\wsimport\java, -d, C:\Source\workspace\TheProject\target\classes, -target, 2.0, -extension, -Xnocompile, -B-enableIntrospection, -b, C:\Source\workspace\TheProject\src\main\resources\bindings\servicebindings.xml, C:\Source\workspace\TheProject\src\main\webapp\WEB-INF\wsdl\CaseService.wsdl] 
no such JAXB option: -enableIntrospection 

Comment puis-je utiliser le -enableIntrospection de xjc avec JAXWS-maven-plugin? Si je ne peux pas, quelles alternatives existent pour personnaliser la génération de code de jaxws de sorte que le getter pour une propriété Boolean est appelé getFoo() (correct) plutôt que isFoo() (qui viole la spécification Java Beans).

Répondre

1

Il semble que le plugin jaxws-maven utilise le xjc du JDK installé. Le plus récent Oracle JDK contient toujours une version de XJC avant que le support de -enableIntrospection ne soit ajouté.

J'ai ensuite examiné en utilisant un JAXB-Plugin. Il turnsout que le plugin jaxws-maven-plugin ne fournit pas un moyen facile d'ajouter au classpath de XJC, qui est nécessaire pour charger JAXB-Plugins.

Le remplacement de jaxws-maven-plugin n'était pas possible pour des raisons politiques (quelque chose comme "jaxws est la norme, seules les bibliothèques standard peuvent être utilisées").

Je suis donc retombé à écrire un plugin Maven qui lit le code source après génération, est-

content.replace("public Boolean is", "public Boolean get"); 

et écrit le fichier source sur le disque. Cela m'a également permis d'injecter des définitions de equals() et hashCode() qui s'appuient sur la convention de dénomination pour les clés métier dans l'API que je consomme.

1

Ajout de getters pour les booléens aux artefacts générés par JAX-WS, au lieu d'utiliser l'option enableIntrospection et le mécanisme de remplacement approuvé par Java.

Seul JAX-WS RI 2.1.13 prend en charge l'option enableIntrospection. Mais JavaSE6 1.6.0_65 est livré avec JAVA-WS RI 2.1.6. Une façon de résoudre ce problème consiste à utiliser le mécanisme de substitution approuvé par Java pour copier jaxws-api.jar et jaxb-api.jar dans le répertoire approuvé par JRE/JDK.

Une autre méthode consiste à ne pas utiliser l'option enableIntrospection, mais d'ajouter des getters pour les booléens aux artefacts générés par JAX-WS. Ces getters peuvent être ajoutés avec le plugin maven remplaçant.

plugin Maven pour ajouter de succédané une méthode get:

<plugin> 
    <groupId>com.google.code.maven-replacer-plugin</groupId> 
    <artifactId>replacer</artifactId> 
    <version>1.5.2</version> 
    <executions> 
     <execution> 
      <phase>process-resources</phase> 
      <goals> 
       <goal>replace</goal> 
      </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <basedir>${project.basedir}</basedir> 
     <includes> 
      <include>src/main/java/lu/etat/cie/rn/rpp/ws/**/*.java</include> 
     </includes> 
     <token>public Boolean is(.*)\(\)(\s*\{\s*.+\s*\})</token> 
     <value>public Boolean is$1\(\)$2 
    public Boolean get$1\(\)$2</value> 
    </configuration> 
</plugin> 

Remplace:

public Boolean isProperty() { 
    return property; 
} 

Avec:

public Boolean isProperty() { 
    return property; 
} 
public Boolean getProperty() { 
    return property; 
} 
Questions connexes