Ошибки при создании клиента веб-службы в Java - PullRequest
3 голосов
/ 04 мая 2011

Я видел эту проблему по всему Интернету, но все еще не нашел четкого решения, которое бы сработало для меня.Вот проблема:

Я пытаюсь создать клиент Web-сервиса на Java.Клиент должен быть консольным приложением, которое будет размещаться на сервере и автоматически запускаться через определенный промежуток времени.Веб-сервис, который я пытаюсь использовать, был написан и поддерживается сторонней компанией.Сервис был написан на ASP.NET.У рассматриваемой компании есть несколько услуг, которые мы попали.Все они написаны на ASP.NET.Я никогда не имел дело с этими службами до 2 дней назад, когда мне было поручено использовать 2 службы и создать электронную таблицу Excel из данных.Прежде чем продолжить, позвольте мне описать мою среду разработки.Некоторые из них актуальны, некоторые нет, но я хочу включить все:

  • 32-разрядная версия Windows 7 Professional
  • IDE NetBeans 6.9.1
  • JavaJDK 1.6.0_17
  • jre6
  • Полный выпуск платформы Glassfish 3 с открытым исходным кодом
  • Все программы имеют все доступные обновления

Вкл.эта проблема.Когда я добавил первый клиент Web-сервиса в свое консольное приложение, я был удивлен тем, насколько гладко прошел процесс.Большая часть моего опыта написания приложений для веб-сервисов находится в .NET.Я смог импортировать WSDL и NetBeans сгенерировал все классы с первой попытки.В течение 5 минут я смог сделать свой первый звонок в службу и получил ожидаемый ответ, сообщив мне, что моя попытка была успешной.Затем я добавил второго клиента веб-службы в консольное приложение, используя адрес для второго необходимого WSDL.Вот где я столкнулся с серьезной проблемой.

После импорта WSDL меня предупредил об ошибке NetBeans, заявив:

Клиент веб-службы не может быть создан JAXWS:утилита wsimport.Причина: неопределенное объявление элемента ': схема'

После злоупотребления Google в течение следующего часа в поисках решения я, наконец, решил применить метод проб и ошибок.Глядя на окно «Вывод» в NetBeans, я увидел, что оно жаловалось на 3 конкретные строки.Когда я взглянул на WSDL, я увидел, что эти 3 строки были точно такими же, как показано ниже:

<s:element ref="s:schema" />

Эти 3 строки были найдены в случайных местах от вершины WSDL, вплоть допримерно на полпути.Я удалил эти строки из WSDL, найденного в папке «Ссылки на веб-службы», оставив WSDL только в папке META-INF.Затем я обновил ссылку на службу и, к моему большому удивлению, NetBeans проанализировал WSDL и сгенерировал мои классы, как и раньше.Отлично, верно?Ну, вот где проблема №2 вступает в игру.

Теперь, когда я смог скомпилировать свое приложение без ошибок, мне пришлось попытаться запустить службу, чтобы проверить, сработал ли мой хак.Это не так.Из-за другой ошибки в JAXWS, я должен предоставить URL для WSDL в конструкторе при создании объекта службы.Это означает, что установленный мной WSDL игнорируется, и теперь сервис снова использует WSDL, который невозможно проанализировать.Когда я попытался указать местоположение WSDL, которое я отредактировал локально в своем проекте, меня встретила другая ошибка компиляции, в которой говорилось, что у меня есть исключение NullPointerException.Он сказал, что мне нужно инициализировать объект перед его использованием.

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

Заранее благодарен за любую оказанную помощь.

Ответы [ 2 ]

0 голосов
/ 05 мая 2011

Односторонние изменения контракта могут привести к проблемам.

Предполагая, что префикс s относится к пространству имен http://www.w3.org/2001/XMLSchema, похоже, что ваши WSDL ссылаются на типы схем XML. JAX-WS, вероятно, не может решить эту проблему при создании привязок JAXB.

Вы можете загрузить XSD из http://www.w3.org/2001/XMLSchema.html; как минимум, вам понадобятся XMLSchema.xsd, XMLSchema.dtd и datatypes.dtd. Для генерации типов Java из этого может потребоваться возиться с вашей конфигурацией привязки JAXB.

В качестве альтернативы может быть проще использовать динамический код клиента JAX-WS . Вы можете использовать такой инструмент, как soapUI, для создания / тестирования образцов XML-запросов.


Если вы решите отредактировать WSDL, сгенерированный код службы должен иметь конструктор вида Foo_Service(URL, QName), который позволяет вам предоставлять WSDL локально (например, из вашего пути к классам).

0 голосов
/ 05 мая 2011

Первое, что я хотел бы сделать, это попытаться открыть его в одном из инструментов, предназначенных для тестирования служб SOAP, таких как SoapUI. Если ваша схема не разрешается, возможно, вам понадобятся фрагменты кода, которые также не будут сгенерированы. У меня было такое недавно с поставщиком, поставляющим «веб-сервис», и после долгих разборок они «чудесным образом» нашли альтернативный набор сервисов, который работал нормально.

Вы также можете попробовать некоторые альтернативы Jax-W, такие как CXF или Axis.

...