2012-03-21 3 views
13

Possiedo un servizio Web basato su JAX-WS il cui WSDL viene generato da un altro modulo Maven (che chiamerò ws-consumer).Controllo del valore dell'attributo wsdlLocation JAX-WS (percorso assoluto) con jaxws-maven-plug

bene o nel male, copiamo il "WSDL pubblicati" (la versione del WSDL & XSD che il servizio ha tenuto/generato a punto di rilascio) al nostro cartella src/wsdl di ws-consumer e quindi utilizzare jaxws-maven-plugin da org.jvnet a generare un client utilizzando jaxws:wsimport con la seguente configurazione (troncato):

<plugin> 
     <groupId>org.jvnet.jax-ws-commons</groupId> 
     <artifactId>jaxws-maven-plugin</artifactId> 
     <version>2.1</version> 
     <executions> 
      <execution> 
       <!--phase>generate-sources</phase --> 
       <goals> 
        <goal>wsimport</goal> 
       </goals> 
       <configuration> 
        <wsdlDirectory>src/main/resources/META-INF/wsdl/</wsdlDirectory> 
        <wsdlFiles> 
         <wsdlFile>MyWS/MyWS.wsdl</wsdlFile> 
        </wsdlFiles> 
       </configuration> 
      </execution> 
     </executions> 
    </plugin> 

Ora, il codice client generato ha le seguenti annotazioni applicate a livello di classe:

@WebServiceClient(name = "MyWS", targetNamespace = "http://myws/blah", wsdlLocation = "**file:/C:/some/absolute/path/src/main/resources/META-INF/wsdl/MyWS/MyWS.wsdl"**) 

sottolineatura mia

Come si può vedere si spera, il valore dell'attributo wsdlLocation ha un percorso assoluto hard-coded che sta per essere corretto quando il servizio viene distribuito.

C'è un modo per "controllare" questo impostandolo su solo META-INF/wsdl/MyWS/MyWS.wsdl o qualche altro valore?

risposta

10

E 'possibile con il plugin Codehaus:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>jaxws-maven-plugin</artifactId> 
    <version>1.9</version> 
    <executions> 
    <execution> 
     <goals> 
     <goal>wsimport</goal> 
     </goals> 
    </execution> 
    </executions> 
    <configuration> 
    <keep>true</keep> 
    <verbose>true</verbose> 
    <wsdlDirectory>../wscontract/src/main/resources/wsdl</wsdlDirectory> 
    <wsdlLocation>wsdl/MaintainAddress.wsdl</wsdlLocation> 
    <sourceDestDir>src/main/java</sourceDestDir> 
    <bindingDirectory>.</bindingDirectory> 
    <bindingFiles> 
     <bindingFile>jaxb/xsdbindings.xml</bindingFile> 
     <bindingFile>jaxb/wsdlbindings.xml</bindingFile> 
    </bindingFiles> 
    </configuration> 
</plugin> 

Forse il plugin che si sta utilizzando ha un'opzione simile o forse si può considerare il passaggio.

È anche possibile eseguire il provisioning del WSDL in modo esplicito, nel qual caso questa proprietà viene ignorata, anche se potrebbe non essere appropriata in un'applicazione gestita dal contenitore.

Codice di esempio here.

+0

Questo era fondamentalmente la risposta. jaxws-maven-plugin fornisce wsdlLocation che può eseguire il jolly ma sovrascrivere il valore WebServiceClient.wsdlLocation generato. Grazie! –

+1

@McDowell - Penso che il plugin codehaus sia stato migrato su jax-ws-commons. Per http://jax-ws-commons.java.net/jaxws-maven-plugin/: 'Questo plugin contiene l'adattatore Maven per il set di strumenti di JAX-WS. La versione originale di questo è stata sviluppata nel progetto codehaus mojo, ma a marzo 2007 il progetto è stato spostato su jax-ws-commons. – Cheeso

+0

@atc cosa hai inserito in wsdlLocation? Poiché abbiamo anche cercato di individuarlo nella cartella in cui si trova il nostro WSDL, via 1) aggiungi src/main/wsdl e in questo caso: abbiamo il file WSDL (Soap_1.wsdl) in WEB-INF/classi generati WAR 2) basta mettere Soap_1.wsdl. Ma ancora non funziona. Come l'hai aggiustato nel tuo caso? –

-1

La versione 1.12 non riconosce <wsdlLocation>. Si lamenta:

No WSDLs are found to process, Specify atleast one of the following parameters: wsdlFiles, wsdlDirectory or wsdlUrls. 

Versione 1.9 (come nel tuo esempio) semplicemente ignora tutto e non produce alcun codice.

Qualcosa deve essere cambiato.

+0

Uno dei parametri 'wsdlFiles',' wsdlDirectory' o 'wsdlUrls' è ** obbligatorio **, poiché questi parametri specificano la posizione" fisica "di uno o più file WSDL. 'wsdlLocation' è usato per il valore dell''annotazione' @ WebServiceClient.wsdlLocation' ** ** **. –

+0

@FlorianWolters come posso impostare l'URL di posizione del file wsdl nel modulo di backend di Android? ho provato a metterlo in 'src \ main \ java \ webapp' e anche nella directory' .... \ webapp \ WEB-INF', ma ottengo questo errore 'javax.xml.ws.WebServiceException: Impossibile trovare './ src/main/java/webapp/WEB-INF/Checkout.wsdl 'wsdl. Posizionare correttamente la risorsa nel classpath. –

+0

@gikarasojo kinene Non ho esperienza con lo sviluppo di Android, ma se si utilizza Maven, la procedura dovrebbe essere la stessa.Immagino tu voglia creare un client JAX-WS? Raccomando di leggere (e guardare il codice sorgente) del seguente articolo: https://docs.oracle.com/javaee/7/tutorial/jaxws001.htm. –

4

Utilizzare wsdlLocation con il jaxws-maven-plugin dal org.jvnet.jax-ws-commons:

<plugin> 
<groupId>org.jvnet.jax-ws-commons</groupId> 
<artifactId>jaxws-maven-plugin</artifactId> 
<version>2.3</version> 
<executions> 
    <execution> 
     <goals> 
      <goal>wsimport</goal> 
     </goals> 
    </execution> 
</executions> 
<configuration> 
    <wsdlDirectory>src/main/resources/wsdl</wsdlDirectory> 
    <wsdlFiles> 
     <wsdlFile>arsdev.wsdl</wsdlFile> 
    </wsdlFiles> 
    <wsdlLocation>wsdl/*</wsdlLocation> 
    <!-- Keep generated files --> 
    <keep>true</keep> 
    <packageName>jaxws.remedy.client.generated</packageName> 
    <!-- generated source files destination --> 
    <sourceDestDir>target/generated-code/src</sourceDestDir> 
</configuration> 
</plugin> 
+1

Questo ha funzionato per me, finalmente. Ma solo, se fornisci un precedente "/" in wsdlLocation - come questo /wsdl/* jonashackt

+0

I dettagli possono anche essere visualizzati localmente: 'mvn jaxws: help -Dgoal = wsimport -Ddetail' –

0

ho votato per @ risposta Dean-Schulze, come è appropriato per il caso di org .jvnet.jax-ws-commons: plugin jaxws-maven-plugin.

Può anche essere interessante per visualizzare la guida a livello locale con CLI, in questo modo:

mvn jaxws:help -Dgoal=wsimport -Ddetail 

Come detto nella risposta precedente, siamo in grado di utilizzare il parametro wsdlLocation, descritto qui:

wsdlLocation 
    @WebService.wsdlLocation and @WebServiceClient.wsdlLocation value. 
    Can end with asterisk in which case relative path of the WSDL will be 
    appended to the given wsdlLocation. 

    Example: 

    ... 
    <configuration> 
    <wsdlDirectory>src/mywsdls</wsdlDirectory> 
    <wsdlFiles> 
    <wsdlFile>a.wsdl</wsdlFile> 
    <wsdlFile>b/b.wsdl</wsdlFile> 
    <wsdlFile>${basedir}/src/mywsdls/c.wsdl</wsdlFile> 
    </wsdlFiles> 
    <wsdlLocation>http://example.com/mywebservices/*</wsdlLocation> 
    </configuration> 
    ... 
    wsdlLocation for a.wsdl will be http://example.com/mywebservices/a.wsdl 
    wsdlLocation for b/b.wsdl will be 
    http://example.com/mywebservices/b/b.wsdl 
    wsdlLocation for ${basedir}/src/mywsdls/c.wsdl will be 
    file://absolute/path/to/c.wsdl 


    Note: External binding files cannot be used if asterisk notation is in 
    place. 

L'opzione -wsdllocation è inoltre documentata sul comando wsimport dal JDK:

Ma si dice solo (vedi @WebServiceClient javadoc):

Specifies the @WebServiceClient.wsdlLocation value.