wake-up-neo.net

So ändern Sie den Webdienst-URL-Endpunkt

Ich habe einen Web-Service-Client mit JBoss-Utils (JAX-WS-kompatibel) Mit Eclipse-Web-Service-Client aus einem WSDL erstellt.

Das einzige, was ich zur Verfügung gestellt habe, war eine URL zu einer WSDL für Web-Services.

Nun fordert mich der Web-Service-Provider auf, die "URL des Client-Endpunkt-Anwendungszugriffs" des Web-Service zu ändern.

Was ist das und wie kann man es ändern?

88
EugeneP

IMO, der Anbieter sagt Ihnen, dass Sie den Service-Endpunkt (d. H. Wo er den Web-Service erreichen soll) ändern müssen, nicht den Client-Endpunkt (ich verstehe nicht, was das sein könnte). Um den Serviceendpunkt zu ändern, haben Sie grundsätzlich zwei Optionen.

Verwenden Sie den Binding Provider, um die Endpunkt-URL festzulegen

Die erste Option besteht darin, den BindingProvider.ENDPOINT_ADDRESS_PROPERTY-Eigenschaftswert der BindingProvider zu ändern (jeder Proxy implementiert die javax.xml.ws.BindingProvider-Schnittstelle):

...
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 noch auf die ursprüngliche WSDL zugegriffen werden kann. Nicht empfohlen.

Verwenden Sie die WSDL, um die Endpunkt-URL abzurufen

Die zweite Option besteht darin, die Endpunkt-URL von 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]));
...
155
Pascal Thivent

Um hier eine Klarstellung hinzuzufügen, verwendet die Serviceklasse beim Erstellen Ihres Service die Standardeinstellung 'wsdlLocation', die beim Erstellen der Klasse aus dem wsdl eingefügt wurde. Wenn Sie also über eine Serviceklasse mit dem Namen SomeService verfügen und eine Instanz wie folgt erstellen:

SomeService someService = new SomeService();

Wenn Sie in SomeService nachschauen, werden Sie feststellen, dass der Konstruktor folgendermaßen aussieht:

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

Wenn Sie also auf eine andere URL verweisen möchten, verwenden Sie einfach den Konstruktor, der ein URL-Argument benötigt (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 Sie zu dieser URL umleiten möchten:

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

und das nennt diesen Konstruktor im Service:

public SomeService(URL wsdlLocation) {
    super(wsdlLocation, SOMESERVICE_QNAME);
}
15
MattC

Ich würde nicht so weit gehen, wie @Femi ändern die vorhandene Adresseigenschaft. 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 zu Java), und Aktualisierungen sind nicht schwieriger als mit der BindingProvider-Option (die übrigens bei mir nicht funktioniert hat).

0
TastyWheat