Як змінити кінцеву точку 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 = нова URL ("WSDL_URL"); в першому рядку ??
Хайме Хаблуцель

3
ось посилання на підручник tugdualgrall.blogspot.com/2009/02/…
shareef

12
Варто зазначити, що сучасні wsimportінструменти вже не генерують код get[Service]Portметодом. Замість цього зателефонуйте get[Service]та передайте отриманий об’єкт a, BindingProviderщоб встановити ці властивості.
Крістофер Шульц

Дякуємо @ChristopherSchultz за пораду wsimport! Та деф. працював на нас
Cuga

1
Наскільки я розумію з cxf, створеного заглушкою коду, другий варіант вище змінює wsdl url, а не службовий 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);
}

2
Не обов'язково. У мене є служби, згенеровані за допомогою wsdl2java Apache CXF, і навіть коли ми передаємо нове розташування wsdl конструктору, його порти все ще намагаються прив’язатись до місця розташування, встановленого під час компіляції / генерації (не залишаючи іншого вибору, крім введення порту в BindingProvider і встановити нову адресу у своїй контекстній карті запиту.)
luis.espinal

1
@Luis - важко точно знати, що ви бачите, але якщо ви налагоджуєте, вам слід побачити виклик у класі провайдера javax, а потім побачити його, спробуйте створити кінцеву точку з вашим новим розташуванням wsdl (припустимо, що ви використовуєте JAX-WS 2.0 +). Тоді всередині вашої послуги виклик getPort повинен викликати super.getPort, для якого використовується новий порт, встановлений в об’єкті serviceDelegate. Ось як це має працювати з javax.xml.ws.Service в JAX-WS 2.0. Я поставив би точку перерви на супер дзвінок і досліджував звідти.
MattC

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 (який не працював для мене btw).


-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>

11
У багатьох випадках WSDL вам нав'язують, і ви не повинні його змінювати. Що ще важливіше, від середовища до іншого (тест проти живого), URL-адреса кінцевої точки, швидше за все, зміниться .. і ніхто не хоче налаштувати wsdl і перекомпілювати в цьому випадку.
Myobis
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.