Переопределение или настройка конечной точки веб-службы во время выполнения для кода, сгенерированного с помощью wsimport
Используя код, который был сгенерирован с помощью wsimport
, можно ли переопределить конечную точку службы без необходимости регенерировать код?
Я написал простой веб-сервис java, следующие шаги:
- Я скомпилирую класс java и создаю файл войны
- Разверните файл войны на моем сервере приложений (tomcat)
- Доступ к WSDL через URL, например. локальный: 8080/сервис/HelloService WSDL
- используйте URL-адрес с помощью wsimport.bat для создания классов клиентов, например:
wsimport http://localhost:8080/service/helloservice?Wsdl
- Я использую эти классы в своем клиентском приложении для вызова службы
Проблема заключается в том, что служба развертывается на сервере приложений, работающем на порту, отличном от 8080, связь между клиентом и сервисом никогда не происходит. Я пытаюсь узнать, что является лучшим способом создания заглушек, которые не имеют сервера и порта, жестко закодированные в заглушке, используемой клиентом.
Ответы
Ответ 1
Ваш клиент может установить конечную точку в сервисе "порт" во время выполнения через интерфейс BindingProvider.
Рассмотрим клиент JAX-WS в этом учебнике JAX-WS. Другой способ написать этот код:
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);
Предостережение: я не загрузил код учебника и протестировал этот код против него.
Ответ 2
Я столкнулся с той же проблемой, и было ужасно, когда код был перенесен на производство, он всегда искал местоположение жестко закодированного WSDL, то есть Windows C:........ и т.д.
Я прошел через различные сообщения и страницы, чтобы найти ответ, однако все не удалось, а затем нашел себе путь, посмотрев на класс обслуживания, созданный при импорте JAX-WS.
Мне пришлось переопределить реализацию местоположения JAX-WS WSDL в моем вызывающем классе, как это.
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);
YourInterfacePort.methods();