JavaEE. Простое создание веб-сервисов с JAX-WS.

JAX-WS (Java API for XML Web Services) – это спецификация из мира JavaEE, посвященная созданию веб-сервисов на языке Java.

Данной спецификации посвящен документ JSR 224. При описании веб-сервисов JAX-WS возможно использование одного из двух подходов:

  • contract firstописание веб-сервиса осуществляется на специальном языке – WSDL (Web Service Descrption Language). В итоге мы получаем XML-документ, описывающий наш веб-сервис.. По данному документу JAX-WS фреймворк может сгенерировать обычные Java-классы, в виде proxy к удаленным сервисам.

  • contract lastпрограммист как обычно проектирует Java-классы с нуля, самостоятельно помечая классы и методы, представляющие Web-сервис, специальными аннотациями и уже по ним генерируется WSDL-документ.

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

Помимо всего прочего JAX-WS поддерживает JAXB (Java API For XML Binding), что дает нам автоматический маппинг между Java-классами и запросами/ответами в виде XML. Достаточно только настроить отображение в JAXB, задав несколько аннотаций!

Если вы не знакомы с JAXB, можете обратиться к этой статье.

Contract Last.

В данном примере мы не будем описывать WSDL вручную, а попробуем создать наш веб-сервис «по старинке», путем написания обычного Java-кода. А генерацию документа доверим JAX-WS-фреймворку.

Итак, для создания веб-сервиса с использованием подхода сontract last нам может пригодиться следующий набор аннотаций, описанный в спецификации JSR 181. Среди них есть:

  • @WebServiceуказывает на то, что данный класс является веб-сервисом JAX-WS.

  • @WebMethodданный метод может быть вызван удаленно и является одним из методов веб-сервиса.

  • @WebParamпозволяет настроить соответствие передаваемых параметров в WSDL и XML.

  • @WebResultпозволяет настроить соответствие возвращаемого результата в WSDL и XML.

Первым делом добавим зависимости в наш проект. Я использую для сборки проектов Maven.

Так как JAX-WS просто спецификация, то нам нужна и реализация. Самыми популярными реализациями JAX-WS являются такие фреймворки как: Apache CXF, Axis2, Metro.

Мы воспользуемся Apache CXF. Добавим следующие зависимости в pom.xml:

В число зависимостей я также добавил плагин Lombok, позволяющий автоматически генерировать большую часть boilerplate-кода, вроде геттеров, сеттеров, конструкторов и так далее.

Пусть наш веб-сервис возвращает список кредитных карт. Простой POJO-класс, представляющий кредитную карту:

Аннотация @XmlRootElement говорит JAXB, что весь элемент CreditCard будет соответствовать корневому тегу.

Теперь создадим интерфейс для нашего сервиса:

Интерфейс содержит два метода: для добавления новой карточки и получения списка всех карт. Наш интерфейс помечен аннотацией @WebService, которая говорит среде JAX-WS о том, что данный интерфейс описывает веб-сервис. Теперь реализуем его:

Класс также помечен аннотацией @WebService, но с параметром endpointInterface, где мы прописываем только что созданный нами интерфейс. Сами методы не делают ничего особенного.

Примечание: если какой-то метод в классе вашего веб-сервиса не должен быть опубликован, вы можете пометить его аннотацией @WebMethod(exclude=true). Эта аннотация также позволяет настроить более точный маппинг между Java-классами и итоговым WSDL-описанием сервиса.

Публикация сервиса.

Итак, наш веб-сервис готов. Для его запуска вы могли бы создать WAR-архив и задеплоить его на сервер. Вы можете так и поступить. В целях нашего примера мы вместо этого воспользуемся специальным Endpoint API, с помощью которого можно запустить наш веб-сервис из обычного Java-приложения и начать принимать запросы.

Endpoint (конечная точка) веб-сервиса — это просто URI-адрес вашего сервиса, по которому он принимает и обрабатывает запросы.

Создадим обычный main-класс:

Внутри мы просто создаем экземпляр класса нашего сервиса, а затем публикуем сервис с помощью статического метода Endpoint.publish(), передав ему в качестве одного параметра адрес, по которому он будет доступен.

Запустив пример и перейдя по адресу http://localhost:8080?wsdl сервис вернет вам опубликованное им WSDL-описание сервиса.

Теперь ваши клиенты могут, получив к нему доступ, сгенерировав клиентские классы для своего приложения.

Тестирование.

Теперь осталось убедиться в том, что наш веб-сервис действительно работает. Для тестирования SOAP и REST сервисов существует очень удобный и популярный инструмент — SoapUI. Получить open-source версию вы можете, перейдя по ссылке https://www.soapui.org/downloads/soapui.html .

После скачивания и завершения установки запустите SoapUI. Ваше рабочее пространство будет выглядеть примерно так:

Создайте новый SOAP-проект, воспользовавшись кнопкой для быстрого создания проекта или щелкните правой кнопкой мыши на Projects и в раскрывшемся меню выберите пункт New SOAP Project. Должно открыться следующее диалоговое окно:

Укажите названия проекта и путь к вашей WSDL:

Вы можете заметить, что SoapUI предлагает нам создать примеры запросов ко всем доступным операциям. Это то, что нам нужно.

В окне слева мы видим проект с нашим веб-сервисом и набором операций:

Теперь попробуем сделать запрос к сервису на добавление новой карты.

Откроется следующее окно:

Вверху прописан адрес сервиса, в левом окне — запрос, а в правом — ответ от сервера. Знаками вопросов внутри элементов XML показываются параметры, которые нужно заполнить. У карточки должны быть заполнены embossedName и number.

После заполнения параметров нажмите кнопку Run:

Сервер ответил и мы не получили никаких сообщений об ошибок. Давайте проверим, что карточка добавилась — выполним второй запрос на получение списка карт:

И правда, мы получили в качестве ответа список карт. Наш веб-сервис работает!

Заключение.

В этом уроке мы познакомились со спецификацией описания веб-сервисов из мира JavaEEJAX-WS, реализовали веб-сервис на ее основе, воспользовавшись подходом contract last. Затем мы успешно протестировали свой веб-сервис с помощью замечательного инструмента для тестирования веб-сервисов — SoapUI.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *