Wie ändere ich den Webservice-URL-Endpunkt?

101

Ich habe einen Webdienst-Client mit JBoss-Utils (JAX-WS-kompatibel) mithilfe von Eclipse 'Webdienst-Client aus einer WSDL' generiert.

Das einzige, was ich zur Verfügung stellte, war eine URL zu einer Webdienst-WSDL.

Jetzt fordert mich der Webdienstanbieter auf, die "URL des Zugriffs auf Client-Endpunktanwendungen" des Webdienstes zu ändern.

Was ist das und wie kann man es ändern?

EugeneP
quelle
Können Sie das Objekt einfach mit demselben Eclipse-Assistenten mit der neuen URL neu erstellen?
Thilo
Teilen Sie dem Webdienstanbieter mit, dass Sie die neue URL für wsdl benötigen, und verwenden Sie sie dann mit dem Eclipse-Assistenten, um den Client neu zu generieren.
Systempuntoout
@Thilo @systemputoout GUYS, das Problem ist, dass sie die gleiche WSDL-URL haben !! Ich bin nicht sicher, aber es scheint mir, dass Sie in Axis beim Aufrufen des Webdienstes eine URL angeben können. In JAX-WS können Sie den "Client-Endpunkt zur Laufzeit" nicht ändern. Irgendwelche Ideen, Leute?
EugeneP
1
@ Pascal Thivent, @systempuntoout Zitieren: "URL oder Endpunkt für den Zugriff auf Clientanwendungen"
EugeneP
1
Mein Verständnis dieses Satzes lautet "Clients greifen auf einen Service-Endpunkt zu; der Endpunktspeicherort hat sich geändert". Und das macht Sinn.
Pascal Thivent

Antworten:

173

IMO, der Anbieter fordert Sie auf, den Service-Endpunkt (dh wo Sie den Web-Service erreichen) und nicht den Client-Endpunkt zu ändern (ich verstehe nicht, was dies sein könnte). Um den Service-Endpunkt zu ändern, haben Sie grundsätzlich zwei Möglichkeiten.

Verwenden Sie den Bindungsanbieter, um die Endpunkt-URL festzulegen

Die erste Option besteht darin, den BindingProvider.ENDPOINT_ADDRESS_PROPERTYEigenschaftswert von BindingProvider(jeder Proxy implementiert die javax.xml.ws.BindingProviderSchnittstelle) zu ändern :

...
EchoService service = new EchoService();
Echo port = service.getEchoPort();

/* Set NEW Endpoint Location */
String endpointURL = "http://NEW_ENDPOINT_URL";
BindingProvider bp = (BindingProvider)port;
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL);

System.out.println("Server said: " + echo.echo(args[0]));
...

Der Nachteil ist, dass dies nur funktioniert, wenn auf die ursprüngliche WSDL noch zugegriffen werden kann. Nicht empfohlen.

Verwenden Sie die WSDL, um die Endpunkt-URL abzurufen

Die zweite Option besteht darin, die Endpunkt-URL aus der WSDL abzurufen.

...
URL newEndpoint = new URL("NEW_ENDPOINT_URL");
QName qname = new QName("http://ws.mycompany.tld","EchoService"); 

EchoService service = new EchoService(newEndpoint, qname);
Echo port = service.getEchoPort();

System.out.println("Server said: " + echo.echo(args[0]));
...
Pascal Thivent
quelle
7
Ich denke, dass es einen Fehler im zweiten Codeblock gibt, sollte es nicht URL newEndpoint = neue URL ("WSDL_URL") sein; in der ersten Zeile?
Jaime Hablutzel
2
Hier ist ein Link zu einem Tutorial tugdualgrall.blogspot.com/2009/02/…
shareef
12
Es sei darauf hingewiesen, dass moderne wsimportTools keinen Code mehr mit einer get[Service]PortMethode generieren . Rufen Sie stattdessen get[Service]das resultierende Objekt auf und wandeln Sie es in a BindingProviderum, um diese Art von Eigenschaften festzulegen.
Christopher Schultz
Danke @ChristopherSchultz für den wsimport-Tipp! Das def. arbeitete für uns
Cuga
1
Soweit ich aus dem von cxf generierten Stub-Code verstehe, ändert die zweite Option oben die wsdl-URL, nicht die Service-URL. Vermisse ich etwas
Cacert
16

Um hier einige Erläuterungen hinzuzufügen, verwendet die Serviceklasse beim Erstellen Ihres Dienstes den Standardwert 'wsdlLocation', der beim Erstellen der Klasse aus der wsdl eingefügt wurde. Wenn Sie also eine Serviceklasse namens SomeService haben und eine Instanz wie diese erstellen:

SomeService someService = new SomeService();

Wenn Sie sich SomeService ansehen, werden Sie feststellen, dass der Konstruktor folgendermaßen aussieht:

public SomeService() {
        super(__getWsdlLocation(), SOMESERVICE_QNAME);
}

Wenn Sie also möchten, dass es auf eine andere URL verweist, verwenden Sie einfach den Konstruktor, der ein URL-Argument akzeptiert (es gibt 6 Konstruktoren zum Festlegen von qname und Features). Wenn Sie beispielsweise einen lokalen TCP / IP-Monitor eingerichtet haben, der Port 9999 überwacht, und zu dieser URL umleiten möchten:

URL newWsdlLocation = new URL("http://theServerName:9999/somePath");
SomeService someService = new SomeService(newWsdlLocation);

und das ruft diesen Konstruktor innerhalb des Dienstes auf:

public SomeService(URL wsdlLocation) {
    super(wsdlLocation, SOMESERVICE_QNAME);
}
MattC
quelle
2
Nicht unbedingt. Ich habe Dienste, die mit wsdl2java von Apache CXF generiert wurden, und selbst wenn wir den neuen wsdl-Speicherort an den Konstruktor übergeben, versuchen seine Ports immer noch, sich an den zum Zeitpunkt der Kompilierung / Generierung festgelegten Speicherort zu binden (und lassen keine andere Wahl, als den Port an BindingProvider und zu typisieren
Stellen Sie
1
@Luis - Es ist schwer genau zu wissen, was Sie sehen, aber wenn Sie debuggen, sollten Sie den Aufruf in der javax Provider-Klasse sehen und dann versuchen, den Endpunkt mit Ihrem neuen wsdl-Speicherort zu erstellen (vorausgesetzt, Sie verwenden JAX-WS 2.0 +). In Ihrem Dienst sollte der getPort-Aufruf dann super.getPort aufrufen, bei dem Ihr neuer Port in einem serviceDelegate-Objekt festgelegt ist. So sollte es mit javax.xml.ws.Service in JAX-WS 2.0 funktionieren. Ich würde einen Haltepunkt für den Superanruf setzen und von dort aus nachforschen.
MattC
0

Ich würde nicht so weit gehen wie @Femi, um die vorhandene Adresseigenschaft zu ändern . Sie können dem Definitionsabschnitt problemlos neue Dienste hinzufügen.

<wsdl:service name="serviceMethodName_2">
  <wsdl:port binding="tns:serviceMethodNameSoapBinding" name="serviceMethodName">
    <soap:address location="http://new_end_point_adress"/>
  </wsdl:port>
</wsdl:service>

Dies erfordert keine Neukompilierung der WSDL nach Java und das Durchführen von Updates ist nicht schwieriger als wenn Sie die Option BindingProvider verwendet haben (was übrigens bei mir nicht funktioniert hat).

Leckeres Weizen
quelle
-6

Um die Eigenschaft der Endadresse zu ändern, bearbeiten Sie Ihre WSDL-Datei

<wsdl:definitions.......
  <wsdl:service name="serviceMethodName">
    <wsdl:port binding="tns:serviceMethodNameSoapBinding" name="serviceMethodName">
      <soap:address location="http://service_end_point_adress"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>
Femi
quelle
11
In vielen Fällen wird Ihnen die WSDL auferlegt, und Sie sollten sie nicht ändern. Noch wichtiger ist, dass sich die Endpunkt-URL von einer Umgebung zur anderen (Test vs Live) wahrscheinlich ändert. In diesem Fall möchte niemand die WSDL optimieren und neu kompilieren.
Myobis