Изучаем 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 и впоследствии интегрирован в реализацию прокси.
>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, показанному в предыдущих главах, но с точки зрения веб-служб. Когда эта аннотация применяется для атрибута (или для геттера), контейнер внедряет экземпляр прокси клиента веб-службы при инициализации приложения.
>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).
>public class WebServiceProducer {
>··@Produces
>··@WebServiceRef
>··private CardValidatorService cardValidatorService;
>}
Благодаря вспомогательному классу WebServiceProducer в листинге 14.32 любые EJB или сервлеты теперь могут внедрять ссылку CardValidatorService с помощью аннотации @Inject и вызова бизнес-метода (листинг 14.33). С помощью такого механизма вы даже можете использовать альтернативы CDI, чтобы перенаправить вызов вашего метода альтернативной веб-службе SOAP, как описано в главе 2.
>@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.
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.