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>
Author: Tunaki, 2017-01-15

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 in target/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.

 1
Author: Tunaki, 2017-01-15 11:52:53