Как изменить конечную точку URL веб-сервиса? - PullRequest
91 голосов
/ 22 марта 2010

Я сгенерировал клиент веб-службы, используя утилиты JBoss (JAX-WS-совместимый) используя Eclipse 'клиент веб-службы из wsdl'.

Итак, единственное, что я предоставил, - это URL веб-службы WSDL.

Теперь провайдер веб-службы предлагает мне изменить «URL-адрес доступа к клиентскому конечному приложению» веб-службы.

Что это и как это изменить?

Ответы [ 4 ]

158 голосов
/ 22 марта 2010

IMO, провайдер говорит вам изменить конечную точку службы (т. Е. Куда обратиться к веб-службе), а не конечную точку клиента (я не понимаю, что это может быть). Чтобы изменить конечную точку службы, у вас есть две возможности.

Используйте Binding Provider для установки URL-адреса конечной точки

Первый вариант - изменить значение свойства BindingProvider.ENDPOINT_ADDRESS_PROPERTY BindingProvider (каждый прокси реализует интерфейс javax.xml.ws.BindingProvider):

...
EchoService service = new EchoService();
Echo port = service.getEchoPort();

/* Set NEW Endpoint Location */
String endpointURL = "http://NEW_ENDPOINT_URL";
BindingProvider bp = (BindingProvider)port;
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL);

System.out.println("Server said: " + echo.echo(args[0]));
...

Недостатком является то, что это работает только тогда, когда оригинальный WSDL все еще доступен. Не рекомендуется.

Используйте WSDL для получения URL-адреса конечной точки

Второй вариант - получить URL-адрес конечной точки из WSDL.

...
URL newEndpoint = new URL("NEW_ENDPOINT_URL");
QName qname = new QName("http://ws.mycompany.tld","EchoService"); 

EchoService service = new EchoService(newEndpoint, qname);
Echo port = service.getEchoPort();

System.out.println("Server said: " + echo.echo(args[0]));
...
15 голосов
/ 20 марта 2015

Чтобы добавить некоторые пояснения, когда вы создаете свой сервис, класс сервиса использует стандартное wsdlLocation, которое было вставлено в него, когда класс был построен из wsdl. Поэтому, если у вас есть класс обслуживания с именем SomeService, и вы создаете экземпляр, подобный этому:

SomeService someService = new SomeService();

Если вы заглянете внутрь SomeService, вы увидите, что конструктор выглядит так:

public SomeService() {
        super(__getWsdlLocation(), SOMESERVICE_QNAME);
}

Так что, если вы хотите, чтобы он указывал на другой URL, вы просто используете конструктор, который принимает аргумент URL (есть также 6 конструкторов для установки qname и функций). Например, если вы настроили локальный монитор TCP / IP, который прослушивает порт 9999, и вы хотите перенаправить на этот URL:

URL newWsdlLocation = "http://theServerName:9999/somePath"
SomeService someService = new SomeService(newWsdlLocation);

и это вызовет этот конструктор внутри службы:

public SomeService(URL wsdlLocation) {
    super(wsdlLocation, SOMESERVICE_QNAME);
}
0 голосов
/ 27 декабря 2018

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

<wsdl:service name="serviceMethodName_2">
  <wsdl:port binding="tns:serviceMethodNameSoapBinding" name="serviceMethodName">
    <soap:address location="http://new_end_point_adress"/>
  </wsdl:port>
</wsdl:service>

Для этого не требуется перекомпиляция WSDL для Java, и создание обновлений не сложнее, чем если бы вы использовали опцию BindingProvider (которая, кстати, у меня не работала).

0 голосов
/ 09 ноября 2013

Чтобы изменить свойство конечного адреса, отредактируйте файл wsdl

<wsdl:definitions.......
  <wsdl:service name="serviceMethodName">
    <wsdl:port binding="tns:serviceMethodNameSoapBinding" name="serviceMethodName">
      <soap:address location="http://service_end_point_adress"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>
...