nadpisywanie lub ustawianie punktu końcowego usługi sieci web w czasie wykonywania dla kodu generowanego za pomocą wsimport

Używając kodu wygenerowanego za pomocą wsimport, czy punkt końcowy usługi może zostać nadpisany bez konieczności regeneracji kodu?

Napisałem prosty webservice java, oto kroki:

  1. kompiluję klasę java i generuję plik war
  2. wdrożyć plik war na moim serwerze aplikacji (tomcat)
  3. dostęp do WSDL poprzez URL np. localhost: 8080 / service / helloservice?wsdl
  4. użyj adresu URL z wsimport.bat do generowania klas klientów dla przykład: wsimport http://localhost:8080/service/helloservice?Wsdl
  5. używam tych klas w mojej aplikacji klienta, aby zadzwonić do usługi

Problem polega na tym, że usługa jest wdrażana na serwerze aplikacji działającym na porcie innym niż 8080, komunikacja między Klientem a usługą nigdy się nie dzieje. Próbuję się dowiedzieć, jaki jest najlepszy sposób na tworzenie stubów, które nie mają serwera i portu na twardo zakodowanego w stubie używanym przez Klienta.

 52
Author: GargantuChet, 2010-08-25

2 answers

Twój Klient może ustawić punkt końcowy w usłudze "port" w czasie wykonywania za pomocą interfejsu BindingProvider .

JAX-WS client znajduje się w tym samouczku JAX-WS

. Innym sposobem napisania tego kodu jest:

HelloService service = new HelloService();
Hello port = service.getHelloPort();
BindingProvider bindingProvider = (BindingProvider) port;
bindingProvider.getRequestContext().put(
      BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
      "http://foo:8086/HelloWhatever");
String response = port.sayHello(name);

Zastrzeżenie: nie pobrałem kodu samouczka i przetestowałem ten kod na nim.

 84
Author: McDowell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-25 18:59:31

Miałem do czynienia z tym samym problemem, i to było straszne, bo po przeniesieniu kodu do produkcji zawsze szukał zakodowanej na twardo lokalizacji WSDL tj. Windows C:........etc

Przeszedłem przez różne posty i strony, aby znaleźć odpowiedź, jednak wszystko zawodziło, a następnie znalazłem sposób, patrząc na klasę usług generowaną przez import JAX-WS.

Musiałem nadpisać implementację lokalizacji JAX-WS WSDL w mojej klasie wywołującej, jak to.

URL baseUrl;
URL wsdlURL = null;
baseUrl = <your Services>.class.getResource(".");
try {
    wsdlURL = new URL(baseUrl, "http://<your path>?wsdl");
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
}

<your Services> yourServices = new <your Services(wsdlURL,new QName("your namespace", "<your service name>"));
System.out.println(Services.getWSDLDocumentLocation());
YourInterface YourInterfacePort =  yourServices.getServicePort();
BindingProvider bindingProvider = (BindingProvider)YourInterfacePort;
bindingProvider.getRequestContext().put(
          BindingProvider.ENDPOINT_ADDRESS_PROPERTY,      url);

Twój interfejs.metody ();

 2
Author: user3749126,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-31 11:12:24