Как изменить конечную точку URL-адреса веб-сервиса?

101

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

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

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

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

ЕвгенийП
источник
Можете ли вы просто воссоздать это, используя тот же мастер Eclipse с новым URL-адресом?
Тило,
Сообщите поставщику веб-услуг, что вам нужен новый URL-адрес для wsdl, а затем используйте его с мастером Eclipse для восстановления клиента.
systempuntoout
@Thilo @systemputoout РЕБЯТА, проблема в том, что у них ОДИН URL WSDL !! Я не уверен, но мне кажется, что в Axis вы можете указать URL-адрес при вызове веб-службы. В JAX-WS нельзя изменить «конечную точку клиента во время выполнения». Есть идеи, ребята?
EugeneP
1
@ Pascal Thivent, @systempuntoout Цитата: «URL-адрес или конечная точка для доступа к клиентскому приложению»
EugeneP,
1
Я понимаю это предложение так: «клиенты получают доступ к конечной точке службы; местоположение конечной точки изменилось». И в этом есть смысл.
Паскаль Тивент,

Ответы:

174

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

Используйте поставщик привязки, чтобы установить 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]));
...
Паскаль Тивент
источник
7
Я думаю, что во втором блоке кода ошибка, не должен ли это быть URL newEndpoint = new URL ("WSDL_URL"); в первой строке ??
Jaime Hablutzel
3
вот ссылка на руководство tugdualgrall.blogspot.com/2009/02/…
shareef
12
Стоит отметить, что современные wsimportинструменты больше не генерируют код с помощью get[Service]Portметода. Вместо этого вызовите get[Service]и приведите результирующий объект к a, BindingProviderчтобы установить такие свойства.
Christopher Schultz
Спасибо @ChristopherSchultz за подсказку wsimport! Эта деф. работал у нас
Cuga
1
Насколько я понимаю из сгенерированного cxf кода заглушки, второй вариант выше изменяет URL-адрес wsdl, а не URL-адрес службы. Я что-то упускаю?
cacert
16

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

SomeService someService = new SomeService();

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

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

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

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

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

public SomeService(URL wsdlLocation) {
    super(wsdlLocation, SOMESERVICE_QNAME);
}
MattC
источник
2
Не обязательно. У меня есть службы, созданные с помощью Apache CXF wsdl2java, и даже когда мы передаем новое местоположение wsdl конструктору, его порты все еще пытаются привязаться к местоположению, установленному во время компиляции / генерации (не оставляя никакого выбора, кроме как привести тип порта к BindingProvider и установить новый адрес в его контекстной карте запроса.)
luis.espinal 02
1
@Luis - Трудно понять, что именно вы видите, но если вы отлаживаете, вы должны увидеть вызов класса провайдера javax, а затем увидеть, как он пытается создать конечную точку с вашим новым местоположением wsdl (при условии, что вы используете JAX-WS 2.0 +). Затем внутри вашей службы вызов getPort должен вызывать super.getPort, который использует ваш новый порт, установленный в объекте serviceDelegate. Вот как это должно работать с javax.xml.ws.Service в JAX-WS 2.0. Я бы поставил точку останова на супервызове и начал расследование оттуда.
MattC 03
0

Я бы не стал заходить так далеко до @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 (который, кстати, у меня не сработал).

Вкусный
источник
-6

Чтобы изменить свойство конечного адреса, отредактируйте файл 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>
Femi
источник
11
Во многих случаях вам навязывают WSDL, и вы не должны его менять. Что еще более важно, от среды к среде (тестовая или прямая) URL-адрес конечной точки, вероятно, изменится ... и никто не хочет настраивать wsdl и перекомпилировать в этом случае.
Myobis