Каковы допустимые возвращаемые типы Java @ WebMethod?

#java #web-services #webmethod

#java #веб-сервисы #webmethod

Вопрос:

Я пишу веб-сервис с использованием Java. Теперь у меня есть @WebMethod, который должен возвращать некоторые данные, и я не уверен, какой формат использовать. Я видел, что в других языках существуют определенные ограничения на типы возвращаемых данных @WebMethod — это то же самое для Java?

Когда я попытался вернуть документ DOM, содержащий XML, я получил сообщение об ошибке «Не удается создать JAXBContext», поэтому я изменил его на просто возврат массива строк. Однако получение содержимого из этого массива довольно утомительно. У кого-нибудь есть решение получше?

Спасибо,

VeganSmarties

Ответ №1:

Когда я внедрял веб-сервисы JAX-WS, все мои возвращаемые типы были снабжены аннотациями JAXB (@XmlElement, …), и они также были сериализуемыми. РЕДАКТИРОВАТЬ: это означает, что любой тип не будет работать, и вам придется создавать оболочки вокруг структур, которые вы хотите вернуть.

Комментарии:

1. Спасибо — Итак, вы создали свои собственные объекты, сделали их сериализуемыми, снабдили их комментариями и затем вернули их? Значит, не все возвращаемые типы WebMethod должны быть в XML, но они могут ..?

2. JAX-WS — это Java API для веб-служб XML, что означает, что оба ввода / вывода являются XML-файлами под капотом. Однако примитивы afair и соответствующие им оболочки их массивы обрабатываются автоматически (ваш случай, когда вы превратили return в массив строк).

3. Хорошо! Спасибо — это имеет смысл! 🙂 Последний вопрос — когда я возвращаю строку [][] массива типа {[a, b], [b, c], [c, d]}, xml использует теги <item> для всего, поэтому это выглядит следующим образом: <item> <item> a </item> <item> b </item> </item> <item> <item> b </item> и т.д… Как я могу изменить имена тегов на более значимые данные, скажем, <слово> <буква> или что-то еще?

4. Я не уверен, есть ли элемент для указания имени элемента для элементов на основе массива (но он может быть!), Поэтому я рекомендую вам прочитать об аннотациях JAXB (например, начните с пакета JavaDoc — annotations: download.oracle.com/javaee/6/api/javax/xml/bind/annotation / … ); но вы всегда можете легко создать класс-оболочку, указать имя его элемента; а также использовать @XmlElementWrapper для имени элемента контейнера.

5. @WebResult работает для отдельных строк, я только что узнал, но я попытаюсь найти решение и для массива. Еще раз спасибо за вашу помощь!