Переопределение или настройка конечной точки веб-службы во время выполнения для кода, сгенерированного с помощью 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();