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:
- kompiluję klasę java i generuję plik war
- wdrożyć plik war na moim serwerze aplikacji (tomcat)
- dostęp do WSDL poprzez URL np. localhost: 8080 / service / helloservice?wsdl
- użyj adresu URL z wsimport.bat do generowania klas klientów dla przykład:
wsimport http://localhost:8080/service/helloservice?Wsdl
- 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.
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.
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 ();
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