Веб-сервис Axis2, подход снизу вверх, сложный объект - PullRequest
2 голосов
/ 10 мая 2011

Я использую axis2, чтобы представить метод существующего класса как веб-сервис (подход снизу вверх). Метод принимает сложный объект (не примитивный тип) в качестве параметра и также возвращает сложный объект.

Я понимаю, что axis2 попытается сгенерировать для меня схему в файле wsdl, когда я представлю метод в качестве веб-службы, и я могу получить файл wsdl, посетив URL-адрес веб-службы и добавив? Wsdl в конец это.

Но при ближайшем рассмотрении некоторые атрибуты сложного типа в параметрах представляются как xs: anyType в части схемы результирующего wsdl. Атрибуты, которые конвертируются в xs: anyType - это список. Плохая вещь в этом заключается в том, что когда я генерирую код заглушки для клиентского кода, сигнатура метода для установки этих конкретных атрибутов будет принимать объект в качестве параметра, т.е. setAttribute (Object obj).

Итак, мое решение для этого - использовать JAXB 2.0 для генерации XML-схемы нужных мне классов, а затем импортировать xsd в файл wsdl, созданный axis2 (загруженный из веб-службы url +? Wsdl) и используйте отредактированный wsdl вместо автоматически сгенерированного. Это решение, похоже, хорошо работает на стороне клиента. Сигнатура метода для установки атрибутов, генерируемых кодом заглушки, будет принимать правильный тип, т.е. setAttribute (AnotherComplexType abcd). И с помощью tcpmon я вижу, что xml, отправляемый с клиента на сервер, кажется правильным.

Однако этот подход не работает на стороне сервера, потому что axis2 не использует аннотацию JAXB 2.0 для преобразования полученного XML-кода обратно в классы, которые будет способен обработать открытый метод.

У меня вопрос, есть ли способ решить мою проблему? Возможные способы, которые я могу придумать, - это либо изменить способ, которым axis2 обрабатывает xml после его получения (я согласен с обработкой вручную, если есть способ), либо заставить axis2 хорошо работать с аннотацией JAXB 2.0? Или, может быть, какая-то другая идея?

Примечание: я не использую часть JAX-WS axis2

1 Ответ

1 голос
/ 21 мая 2011

В конце концов я решил это сам. Я сгенерировал код заглушки для серверной части с помощью wsdl, изменил messageReceivers, чтобы использовать вместо этого сгенерированный получатель сообщений, написал класс-оболочку, который реализует сгенерированный интерфейс, написал преобразователь для преобразования объекта из сгенерированных типов в параметр класса-оболочки методы будут представлены моим внутренним типам и вместо этого предоставят класс-оболочку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...