переопределение или установка конечной точки веб-службы во время выполнения для кода, созданного с помощью wsimport - PullRequest
51 голосов
/ 25 августа 2010

Используя код, сгенерированный с помощью wsimport, можно ли переопределить конечную точку службы без необходимости повторной генерации кода?

Я написал простой веб-сервис Java, следующие шаги:

  1. Я компилирую класс java и генерирую файл war
  2. Развертываю файл war на моем сервере приложений (tomcat)
  3. Доступ к WSDL осуществляется через URL, например localhost: 8080 / service /helloservice? wsdl
  4. использовать URL-адрес с wsimport.bat для создания клиентских классов, например: wsimport http://localhost:8080/service/helloservice?Wsdl
  5. Я использую эти классы в своем клиентском приложении для вызова службы

Проблема в том, что служба развернута на сервере приложений, работающем с портом, отличным от 8080, связь между клиентом и службой никогда не происходит.Я пытаюсь узнать, каков наилучший способ создания заглушек, не имеющих сервера и порта, жестко закодированных в заглушке, используемой клиентом.

Ответы [ 2 ]

82 голосов
/ 25 августа 2010

Ваш клиент может установить конечную точку в «порте» службы во время выполнения через интерфейс 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);

Предостережение: я не загружал учебный код и не проверял этот код на нем.

0 голосов
/ 25 июня 2014

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

...