Изучаем Java EE 7 - [227]

Шрифт
Интервал

Структура потребителя SOAP

Поскольку JAX-WS доступен в Java SE, использовать веб-службы SOAP может любой код Java, начиная с класса Main, запущенного в JVM, и заканчивая любым из компонентов Java EE, работающим в контейнере (сетевом, EJB или контейнере клиентских приложений). Если он работает в контейнере, потребитель может получить экземпляр прокси либо путем внедрения, либо создав его программно. Чтобы внедрить веб-службу, вам нужно использовать аннотацию @javax.xml.ws.WebServiceRef или производитель CDI.

Программный вызов

Если ваш потребитель выполняется вне контейнера, необходимо программно вызывать вашу веб-службу SOAP. Как вы можете видеть в листинге 14.30, веб-служба CardValidator не используется непосредственно. Потребитель добавляет экземпляр типа CardValidatorService (который был сформирован из WSDL благодаря wsimport) с помощью ключевого слова new. Затем он должен получить прокси-класс CardValidator (getCardValidatorPort()) для вызова бизнес-методов локально. Локальные вызовы выполняются благодаря методу прокси validate(), который, в свою очередь, вызовет удаленную веб-службу, создаст запрос SOAP, выполнит маршалинг сообщений кредитной карты и т. д. Прокси находит целевую службу, потому что URL конечной точки по умолчанию встроен в файл WSDL и впоследствии интегрирован в реализацию прокси.


Листинг 14.30. Класс Java SE, программно вызывающий веб-службу SOAP

>public class WebServiceConsumer {

>··public static void main(String[] args) {


>····CreditCard creditCard = new CreditCard();

>····creditCard.setNumber("123 41234");

>····creditCard.setExpiryDate("10/12");

>····creditCard.setType("VISA");

>····creditCard.setControlNumber(1234);


>····CardValidator cardValidator = 

>····new CardValidatorService(). getCardValidatorPort();

>····cardValidator.validate(creditCard);

>··}

>}

Хотя этот код очень прост, многое происходит за кулисами. Несколько артефактов были сгенерированы из файла WSDL, чтобы выполнить данную работу. Они содержат всю информацию, необходимую для подключения к URL, где располагается веб-служба, выполняют маршалинг объекта CreditCard в XML, вызывают веб-службу через запрос SOAP и получают результат из ответа SOAP.

Вызов с помощью внедрения

С другой стороны, если ваш потребитель работает в контейнере, для получения ссылки на прокси веб-службы SOAP можно использовать внедрение. В листинге 14.31 показан простой Java-класс main, который работает в контейнере клиентского приложения (ACC) и применяет аннотацию @WebServiceRef. Он следует шаблону аннотаций @Resource и @EJB, показанному в предыдущих главах, но с точки зрения веб-служб. Когда эта аннотация применяется для атрибута (или для геттера), контейнер внедряет экземпляр прокси клиента веб-службы при инициализации приложения.


Листинг 14.31. Класс Java SE, запущенный в ACC и использующий внедрение

>public class WebServiceConsumer {

>···@WebServiceRef

>···private static CardValidatorService cardValidatorService;


>···public static void main(String[] args) {

>·····CreditCard creditCard = new CreditCard();

>·····creditCard.setNumber("123 41234");

>·····creditCard.setExpiryDate("10/12");

>·····creditCard.setType("VISA");

>·····creditCard.setControlNumber(1234);


>·····CardValidator cardValidator = 

>·····cardValidatorService.getCardValidatorPort();

>·····cardValidator.validate(creditCard);

>···}

>}

Обратите внимание, что код в листинге 14.31 будет похожим, если вашим потребителем окажется EJB, сервлет или компонент-подложка JSF. Чтобы выполнить внедрение, вам нужно запустить свой код в контейнере, в противном случае аннотация @WebServiceRef не может быть использована.

Вызов с помощью CDI

Спецификация JAX-WS не была обновлена в Java EE 7 и, следовательно, не охватывает все возможности CDI. Например, вы не можете напрямую внедрить ссылку на прокси веб-службы с помощью аннотации @Inject. Однако, как видно в главе 2, вы можете воспользоваться производителем CDI, чтобы добавить такую ссылку (листинг 14.32).


Листинг 14.32. Вспомогательный класс, который выводит ссылку на веб-службу

>public class WebServiceProducer {

>··@Produces

>··@WebServiceRef

>··private CardValidatorService cardValidatorService;

>}

Благодаря вспомогательному классу WebServiceProducer в листинге 14.32 любые EJB или сервлеты теперь могут внедрять ссылку CardValidatorService с помощью аннотации @Inject и вызова бизнес-метода (листинг 14.33). С помощью такого механизма вы даже можете использовать альтернативы CDI, чтобы перенаправить вызов вашего метода альтернативной веб-службе SOAP, как описано в главе 2.


Листинг 14.33. EJB, использующий производитель CDI для внедрения ссылки на веб-службу

>@Stateless

>public class EJBConsumerWithCDI {

>··@Inject

>··private CardValidatorService cardValidatorService;

>··public boolean validate(CreditCard creditCard) {

>····CardValidator cardValidator = cardValidatorService.getCardValidatorPort();

>····return cardValidator.validate(creditCard);

>··}

>}

Все вместе

Теперь соберем все эти понятия вместе и опишем потребителя, веб-службу SOAP, затем протестируем ее, развернем в GlassFish и вызовем. Мы будем использовать аннотации JAXB и JAX-WS, а также создадим интерфейс конечной точки службы с целью для Maven wsimport. Чтобы написать веб-службу, требуется выполнить несколько шагов. Я продемонстрирую их, повторно рассмотрев веб-службу CardValidator.


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.