Создание клиента CXF из удаленного WSDL, который ссылается на локальный хост

Я использую CXF для создания клиента для подключения к удаленному веб-сервису. У меня нет никакого контроля над веб-службой или определением wsdl.

wsdl веб-сервиса делает несколько ссылок на localhost, например:

<soap12:address location="http://localhost:8002/request" />
<wsa10:EndPointReference>
    <wsa10:Address>http://localhost:8002/request</wsa10:Address>
</wsa10:EndPointReference>

Я пытаюсь сгенерировать свой клиент, используя цель wsdl2java maven, указывая на удаленный wsdl:

...
<wsdlOptions>
<wsdlOption>
<wsdl>http://remotehost:8002/?wsdl</wsdl>
<wsdlOption>
<wsdlOptions>
...

Когда я пытаюсь собрать клиент, цель не выполняется из-за ссылок на локальный хост:

org.apache.cxf.wsd11.WSDLRuntimeException: Fail to create wsdl definition from :       http://remotehost:8002/?wsdl [ERROR] caused by : WSDLException (at  
/wsdldefinitions/wsdl:import) faultCode=PARSER_ERROR: Problem parsing  
'http://localhost:8002/?wsdl=wsdl0'.: java.net.ConnectionException: Connection refused: connect

Есть ли способ заставить CXF понять, что ссылки localhost относятся к хосту wsdl, и автоматически заменить их соответствующим именем хоста при создании клиента?

Мне удалось создать клиента, скопировав wsdl в локальный файл и вручную заменив ссылки на локальные хосты соответствующими именами хостов. Однако мне нужно, чтобы клиент был сгенерирован из удаленного определения wsdl, а не из локального файла. Кто-нибудь знает, как этого можно достичь? В настоящее время я использую cxf версии 2.6.0.

Заранее спасибо за любые ответы.

(Я заменил свои фактические имена служб общими именами, такими как удаленный хост)


person user1397026    schedule 19.05.2012    source источник
comment
Мне интересно, почему они публикуют сломанный веб-сервис - наверняка любой, кто его использует, столкнется с такими же трудностями.   -  person David J. Liszewski    schedule 20.05.2012


Ответы (1)


Вы хотите, чтобы CXF понимал, что ссылки localhost имеют отношение к хосту wsdl, но это не то, что должно пониматься каким-либо инструментом, поскольку WSDL может импортировать другие WSDL из любого места, и это может быть в некоторых случаях правильная ссылка. Просто это не в вашем случае, это ошибка конфигурации с сайта, к которому вы хотите подключиться.

Насколько я понимаю, вы указываете URL-адрес WSDL в качестве аргумента для инструмента, создающего прокси динамически, поэтому вы не можете просто загрузить его и изменить ссылки.

Обходной путь, который я предлагаю, состоит в том, чтобы написать простой прокси, сервлет, который будет подключаться к удаленному URL-адресу (указанному в качестве аргумента) и возвращать WSDL, изменяя ссылки на локальные хосты на правильные. И вы бы передали URL-адрес этого сервлета в качестве аргумента вашей прокси-фабрике. Это неприятно, но единственным хорошим решением является то, что провайдер исправляет свой собственный WSDL.

person Danubian Sailor    schedule 23.05.2012