Come generare un client WebService con CXF wsdl2java per il collegamento URL WSDL online
Sto cercando di generare un client webservice con l'obiettivo wsdl2java
del plugin Apache CXF Maven. Ho un link URL WSDL, ma quando si utilizza il plugin Maven, non sta generando i sorgenti. Il collegamento WSDL di esempio è http://www.webservicex.com/globalweather.asmx?WSDL.
<properties>
<src.generated.dir>src/main/java</src.generated.dir>
<artifact.cxf.version>3.1.6 </artifact.cxf.version>
<xerces.version>2.11.0</xerces.version>
<inbound.wsdl>http://www.webservicex.com/globalweather.asmx?WSDL</inbound.wsdl>
<inbound.wsdl.location>http://www.webservicex.com/globalweather.asmx?WSDL</inbound.wsdl.location>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>${artifact.cxf.version}</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<sourceRoot>${src.generated.dir}</sourceRoot>
<defaultOptions>
<noAddressBinding>true</noAddressBinding>
<faultSerialVersionUID>3105839350746982386</faultSerialVersionUID>
</defaultOptions>
<wsdlOptions>
<wsdlOption>
<wsdl>${inbound.wsdl}</wsdl>
<wsdlLocation>${inbound.wsdl.location}</wsdlLocation>
<serviceName>webservicex</serviceName>
<extraargs>
<extraarg>-client</extraarg>
<extraarg>-verbose</extraarg>
<extraarg>-p</extraarg>
<extraarg>http://webservicex.ent.com/arm/=com.ent.webservicex.arm</extraarg>
</extraargs>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>${xerces.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
1 answers
Il problema non è legato all'uso di un collegamento HTTP a un file WSDL. L'errore restituito dal plugin CXF Codegen è:
Nessun servizio è stato trovato in wsdl:
webservicex
Questo è normale perché il WSDL ospitato su http://www.webservicex.com/globalweather.asmx?WSDL
ha solo un singolo servizio chiamato GlobalWeather
; non ha un servizio chiamato webservicex
. Una definizione di servizio in un WSDL corrisponde a un wsdl:service
elemento, e se si sbircia nel WSDL, si vedrà solo
<wsdl:service name="GlobalWeather">
<!-- ... -->
</wsdl:service>
Quindi, dovresti cambiare la tua configurazione CXF a
<serviceName>GlobalWeather</serviceName>
O addirittura omettere completamente il parametro e lasciare che il plugin lo generi automaticamente (poiché esiste un solo servizio).
Ci sono altre note correlate con la configurazione corrente che sarebbe meglio cambiare:
-
Mai, mai, generare codice all'interno della directory sorgente principale
src/main/java
, come è attualmente fatto con<src.generated.dir>src/main/java</src.generated.dir>
Il codice generato deve sempre essere inserito nella directory di compilazione (cioè
target
default). Questo perché il codice generato non è un vero file sorgente e non dovrebbe essere controllato sul controllo della versione. Per impostazione predefinita, questo è ciò che sta facendo il plugin, generando codice intarget/generated-sources/cxf
, e ti suggerisco di continuare con quello; in quanto tale, devi solo rimuovere<sourceRoot>${src.generated.dir}</sourceRoot>
. Inoltre aggiunge automaticamente il codice sorgente generato come cartella sorgente, quindi tutto verrà comunque compilato. Non è necessaria la dipendenza
xerces
per il funzionamento del plugin, è possibile rimuovere l'intero<dependencies>
sezione del plugin.Non esiste un parametro
<wsdlLocation>
, quindi puoi rimuovere anche quello, non fa nulla.