Я использую 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