2010-01-25 5 views
5

Ich versuche, das WS-Client-Jar direkt aus der @ Webservice Klasse (n) zu generieren.Erstellen eines Web-Service-Clients direkt von der Quelle

Lassen Sie uns dieses Beispiel nehmen:

package com.example.maven.jaxws.helloservice; 
    import javax.jws.WebService; 
    @WebService 
    public class Hello { 
    public String sayHello(String param) { 
    ; return "Hello " + param; 
    } 
    } 

ich eine WAR-Datei erzeugen und verwenden diese Glasfischen webservice zu dienen, und von dort aus kann ich die Glassfish WSDL-URL verwenden, um die Client-Quellen zu erzeugen.

Was ich versuche zu tun ist, den Glassfish Teil zu überspringen. In meinem Maven-Projekt, das den Webservice definiert, möchte ich das jaxws-maven-plugin verwenden, um die Client-Klassen zu erstellen, aber ich kann keine Möglichkeit finden, die tatsächliche URL des Web-Service anzugeben.

Es sollte möglich sein, oder? auch

@see Creating a web-service client with a known but inaccessible wsdl

Antwort

3

Sie sollten die Option <wsdlLocation> verwenden, um den Speicherort des Dienstes anzugeben, an dem die WSDL-Datei nach der Bereitstellung verfügbar sein soll.

Mit -wsdlLocation Schalter

Es ist eine weitere einfache Möglichkeit, es zu tun - nur mit -wsdlLocation Schalter laufen wsimport und die WSDL-Standort Wert, der an die erzeugte Service-Klasse ist relativ und Sie benötigen , um diese WSDL-Datei an dieser relativen Position zu platzieren.

See the post for more details.

+0

Sie sagen also, dass Sie eine Kopie der WSDL von einem vorherigen Lauf herunterladen sollten. Für Metro kann dies schwierig sein, da es zusätzliche Lookups enthält. –

5

eine Web-Service-Client-Anwendung erstellen beginnt immer mit einer bestehenden WSDL-Datei (im Gegensatz zu einem Web-Service-Provider zu entwickeln), und selbst wenn dies nicht der einzige Weg, würde ich vorschlagen, zu verwenden, das wsimport Werkzeug (siehe 5 Techniques for Creating Java Web Services from WSDL für andere Optionen, aber ich werde sie nicht abdecken).

in Ihrem Client-Projekt So fügen Sie den folgenden Code-Schnipsel zu Ihrem pom.xml:

<build> 
    <plugins> 
    <plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>jaxws-maven-plugin</artifactId> 
     <executions> 
     <execution> 
      <goals> 
      <goal>wsimport</goal> 
      </goals> 
      <configuration> 
      <wsdlUrls> 
       <wsdlUrl> 
       http://localhost:8080/helloservice/HelloService?wsdl 
       </wsdlUrl> 
      </wsdlUrls> 
      <packageName>com.example.maven.jaxws.helloclient</packageName> 
      </configuration> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
<bulid> 

Die jaxws-maven-plugin:wsimport mojo standardmäßig auf die Phase generate-sources Lebenszyklus gebunden ist, so dass jede Phase hinter generate-sources läuft die jaxws:wsimport auslösen Tor.

Beachten Sie, dass dies wirklich eine minimale Konfiguration ist. Wenn Sie mehr Details/Kontrolle wünschen, überprüfen Sie die Dokumentation des wsimport mojo.

Zum Beispiel Dateien zu verwenden anstelle von URLs für die WSDL (und Java-Code in einem Ort mehr kompatibel mit Maven Best Practices zu erzeugen), zu verwenden:

<configuration> 
    <sourceDestDir>${project.build.directory}/generated-sources/wsimport</sourceDestDir> 
    <wsdlDirectory>${basedir}/src/wsdl</wsdlDirectory> 
    <wsdlFiles> 
    <wsdlFile>foo.wsdl</wsdlFile> 
    <wsdlFile>bar.wsdl</wsdlFile> 
    </wsdlFiles> 
    ... 
</configuration> 

Update: Um eine Pre aufrufen -konfigurierte Stub (der Endpunkt-Adresse aus dem WSDL verwendet wird), ist der Code:

Hello port = new HelloService().getHelloPort(); 
String result = port.sayHello("Duke!"); 

ist, um aus der in der WSDL spezifiziert einen unterschiedlichen einen Endpunkt, dessen Adresse aufzurufen, definieren die neue Endpunkt-URL und die QName :

URL endpoint_new = new URL("NEW_ADDRESS_HERE"); 
QName qname = new QName("http://"+"ORIGINAL_PACKAGE", "SERVICENAME"); 
Hello port = new HelloService(endpoint_new, qname).getHelloPort(); 

wo ORIGINAL_PACKAGE das Paket ist, wo der Dienst in veröffentlicht wurde, ist SERVICENAME der Name des Service, den wir benötigen, beispielsweise HelloService.

+0

Wenn ich Ihre letzte Lösung verwende (generieren Sie den Client aus einer WSDL-Datei), dann enthält das Client-Jar nicht die URL des Webservice. Gibt es eine Möglichkeit, es mit Maven zu versorgen? Ich sehe nur das Tag, aber sonst nichts ... – ben

+0

Das war so hilfreich; Vielen Dank! –

+1

Bei der Verwendung von '@ WebService' mit Metro wird die WSDL zur Laufzeit generiert und ist daher wahrscheinlich nicht zur Kompilierzeit verfügbar. –

Verwandte Themen