Jak zmienić punkt końcowy adresu URL usługi internetowej?

101

Wygenerowałem klienta usługi sieciowej przy użyciu narzędzi JBoss (kompatybilnych z JAX-WS) przy użyciu Eclipse „klienta usługi sieciowej z wsdl”.

Tak więc jedyną rzeczą, którą podałem, był adres URL do WSDL usługi internetowej.

Teraz dostawca usług sieciowych nakazuje mi zmianę „adresu URL dostępu do aplikacji punktu końcowego klienta” usługi sieciowej.

Co to jest i jak to zmienić?

EugeneP
źródło
Czy możesz po prostu odtworzyć rzecz za pomocą tego samego kreatora Eclipse z nowym adresem URL?
Thilo
Poinformuj dostawcę usług WWW, że potrzebujesz nowego adresu URL do wsdl, a następnie użyj go z kreatorem Eclipse, aby ponownie wygenerować klienta.
systempuntoout
@Thilo @systemputoout GUYS, problem polega na tym, że mają TEN SAM URL WSDL !! Nie jestem pewien, ale wydaje mi się, że w Axis można podać adres URL podczas wywoływania usługi internetowej. W JAX-WS nie można zmienić „punktu końcowego klienta w czasie wykonywania”. Jakieś pomysły, chłopaki?
EugeneP
1
@ Pascal Thivent, @systempuntoout Cite: „Adres URL lub punkt końcowy dostępu do aplikacji klienta”
EugeneP
1
Cóż, rozumiem to zdanie: „klienci uzyskują dostęp do punktu końcowego usługi; lokalizacja punktu końcowego uległa zmianie”. I to ma sens.
Pascal Thivent

Odpowiedzi:

174

IMO, dostawca mówi ci, aby zmienić punkt końcowy usługi (tj. Gdzie uzyskać dostęp do usługi internetowej), a nie punkt końcowy klienta (nie rozumiem, co to może być). Aby zmienić punkt końcowy usługi, zasadniczo masz dwie opcje.

Użyj dostawcy powiązania, aby ustawić adres URL punktu końcowego

Pierwszą opcją jest zmiana BindingProvider.ENDPOINT_ADDRESS_PROPERTYwartości właściwości BindingProvider(każde proxy implementuje javax.xml.ws.BindingProviderinterfejs):

...
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]));
...

Wadą jest to, że działa to tylko wtedy, gdy oryginalny WSDL jest nadal dostępny. Niepolecane.

Użyj WSDL, aby uzyskać adres URL punktu końcowego

Drugą opcją jest pobranie adresu URL punktu końcowego z WSDL.

...
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
źródło
7
Myślę, że w drugim bloku kodu jest błąd, czy nie powinien to być adres URL newEndpoint = nowy adres URL („WSDL_URL”); w pierwszej linii ??
Jaime Hablutzel
3
tutaj jest link do samouczka tugdualgrall.blogspot.com/2009/02/…
shareef
12
Warto zaznaczyć, że nowoczesne wsimportnarzędzia nie generują już kodu get[Service]Portmetodą. Zamiast tego wywołaj get[Service]i rzutuj wynikowy obiekt na a, BindingProvideraby ustawić tego rodzaju właściwości.
Christopher Schultz
Dzięki @ChristopherSchultz za wskazówkę wsimport! Ta def. pracował dla nas
Cuga
1
O ile rozumiem z kodu pośredniczącego wygenerowanego przez cxf, druga opcja powyżej zmienia adres URL wsdl, a nie adres usługi. Czy coś mi brakuje?
cacert
16

Aby dodać tutaj pewne wyjaśnienie, podczas tworzenia usługi klasa usługi używa domyślnego „wsdlLocation”, który został do niej wstawiony, gdy klasa została zbudowana z wsdl. Więc jeśli masz klasę usług o nazwie SomeService i tworzysz taką instancję:

SomeService someService = new SomeService();

Jeśli zajrzysz do środka SomeService, zobaczysz, że konstruktor wygląda tak:

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

Więc jeśli chcesz, aby wskazywał na inny adres URL, po prostu użyj konstruktora, który przyjmuje argument URL (jest 6 konstruktorów do ustawiania qname i funkcji). Na przykład, jeśli skonfigurowałeś lokalny monitor TCP / IP, który nasłuchuje na porcie 9999 i chcesz przekierować do tego adresu URL:

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

a to wywoła ten konstruktor wewnątrz usługi:

public SomeService(URL wsdlLocation) {
    super(wsdlLocation, SOMESERVICE_QNAME);
}
MattC
źródło
2
Niekoniecznie. Mam usługi wygenerowane za pomocą narzędzia wsdl2java Apache CXF, a nawet gdy przekazujemy nową lokalizację wsdl do konstruktora, jego porty nadal próbują powiązać się z lokalizacją ustawioną w czasie kompilacji / generacji (nie pozostawiając żadnego wyboru, ale typecast portu do BindingProvider i ustaw nowy adres na mapie kontekstu żądań.)
luis.espinal
1
@Luis - Trudno dokładnie określić, co widzisz, ale jeśli debugujesz, powinieneś zobaczyć wywołanie klasy dostawcy javax, a następnie zobaczyć, jak próbuje utworzyć punkt końcowy z nową lokalizacją wsdl (zakładając, że używasz JAX-WS 2.0 +). Następnie wewnątrz usługi wywołanie getPort powinno wywołać super.getPort, który używa nowego portu ustawionego w obiekcie serviceDelegate. Tak właśnie powinno działać z javax.xml.ws.Service w JAX-WS 2.0. Ustawiłbym punkt przerwania na super call i zbadałbym od tego momentu.
MattC,
0

Nie posunąłbym się tak daleko, jak @Femi, aby zmienić istniejącą właściwość adresu. Możesz łatwo dodawać nowe usługi do sekcji definicji.

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

Nie wymaga to ponownej kompilacji WSDL na Javę, a dokonywanie aktualizacji nie jest trudniejsze niż w przypadku użycia opcji BindingProvider (która nie zadziałała w moim przypadku).

TastyWheat
źródło
-6

Aby zmienić właściwość adresu końcowego, edytuj plik WSDL

<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
źródło
11
W wielu przypadkach WSDL jest narzucany tobie i nie powinieneś go zmieniać. Co ważniejsze, ze środowiska na inne (test vs live), adres URL punktu końcowego prawdopodobnie ulegnie zmianie ... i nikt nie chce w tym przypadku modyfikować wsdl i rekompilować.
Myobis