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

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

Веб-служба SOAP CardValidator проверяет, что кредитная карта действительна. Она включает один метод, который принимает в качестве параметра объект CreditCard, применяет определенный алгоритм и возвращает значение true, если карта действительна, или false, если это не так. Мы протестируем эту бизнес-логику, а также проведем интеграционное тестирование (с помощью встроенного HTTP-сервера). Как только веб-служба будет протестирована и развернута на GlassFish, wsimport задействуется для создания всех необходимых артефактов для потребителя, который может затем вызвать веб-службу для проверки кредитных карт.

Как показано на рис. 14.6, вы будете использовать два проекта Maven: один для упаковки веб-службы в файл. war (chapter14-service-1.0.war), а другой — для упаковки потребителя в файл. jar (chapter14-consumer-1.0.jar). Эти архивы будут содержать не только разработанный вами код, но и код, сгенерированный как для потребителя (wsimport), так и для службы (среда выполнения JAX-WS).

Написание класса CreditCard

Класс CreditCard, показанный в листинге 14.34, является POJO, используемым в качестве параметра метода веб-службы validate(). Веб-службы SOAP обмениваются XML-сообщениями, а не объектами Java. Класс CreditCard имеет несколько аннотаций JAXB (например, @XmlRootElement), что позволяет ему быть преобразованным в XML так, чтобы его можно было передать в запросе SOAP. Объект CreditCard содержит некоторые базовые обязательные атрибуты, такие как номер кредитной карты, дата истечения срока действия (в формате MM/ГГ), тип кредитной карты (Visa, Master Card, American Express и т. д.), а также контрольное число.


Листинг 14.34. Класс CreditCard с аннотациями JAXB

>@XmlRootElement

>@XmlAccessorType(XmlAccessType.FIELD)

>public class CreditCard {

>···@XmlAttribute(required = true)

>···private String number;

>···@XmlAttribute(name = "expiry_date", required = true)

>···private String expiryDate;

>···@XmlAttribute(name = "control_number", required = true)

>···private Integer controlNumber;

>···@XmlAttribute(required = true)

>···private String type;

>···// Конструкторы, методы работы со свойствами

>}


Рис. 14.6. Собираем все вместе

Написание веб-службы SOAP CardValidator

Веб-служба CardValidator (листинг 14.36) реализует интерфейс Validator (листинг 14.35), и оба имеют JAX-WS-аннотации @WebService. CardValidator является обычным POJO, поэтому считается конечной точкой-сервлетом, а не EJB (поскольку не имеет аннотаций @Stateless или @Singleton). Служба поддерживает метод validate(), который принимает в качестве параметра объект CreditCard. Алгоритм проверки действительности карты заключается в следующем: четные номера действительны, нечетные — нет. Метод возвращает значение типа boolean. Класс и интерфейс будут упакованы в файл с расширением. war (chapter14-service-1.0.war).


Листинг 14.35. Интерфейс веб-службы проверки

>@WebService

>public interface Validator {

>··public boolean validate(CreditCard creditCard);

>}


Листинг 14.36. Компонент веб-службы CardValidator

>@WebService(endpointInterface = "org.agoncal.book.javaee7.chapter14.Validator")

>public class CardValidator implements Validator {

>··public boolean validate(CreditCard creditCard) {


>····Character lastDigit = creditCard.getNumber(). charAt(

>··························creditCard.getNumber(). length() — 1);

>····if (Integer.parseInt(lastDigit.toString()) % 2 == 0) {

>······return true;

>····} else {

>······return false;

>····}

>··}

>}

Для простоты здесь не использовалось дополнительное преобразование от Java к WSDL, поэтому вы не заметили аннотаций @WebMethod, @WebResult или @WebParam, что позволило вам увидеть, как легко можно написать веб-службу, придерживаясь всех стандартных правил преобразования.

Написание модульного теста CardValidatorTest

Модульное тестирование веб-службы SOAP может быть довольно простым, если вы будете тестировать только бизнес-логику (то есть без таких возможностей контейнера, как внедрение, безопасность и т. д.). Модульное тестирование POJO CardValidator означает тестирование алгоритма проверки кредитных карт. Как показано в листинге 14.37, тест создает экземпляр POJO CardValidator, объект CreditCard с четным номером, проверяет его и указывает, что карта действительна. Тогда номер изменяется на нечетный, карта проверяется снова и указывается, что она недействительна.


Листинг 14.37. Модульный тест CardValidatorTest

>public class CardValidatorTest {

>··@Test

>··public void shouldCheckCreditCardValidity() {

>····CardValidator cardValidator = new CardValidator();


>····CreditCard creditCard = new CreditCard("123 41234", "10/10", 1234, "VISA");

>····assertTrue("Кредитная карта действительна", cardValidator.validate(creditCard));


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

>····assertFalse("Кредитная карта недействительна", cardValidator.validate(creditCard));

>··}

>}

Но что вы будете делать, если, например, вашей веб-службе SOAP нужно выполнить внедрение? Если просмотреть код в листинге 14.27, вы заметите, что контейнер выполняет внедрение WebServiceContext, поэтому компонент может проверить, имеет ли пользователь роль Admin. Без контейнера контекст WebServiceContext будет иметь значение null и тест будет считаться проваленным. Для решения этой проблемы вы можете либо создать видимость служб контейнера (например, внедрением WebServiceContext), либо протестировать свои веб-службы SOAP в режиме интеграции, то есть внутри контейнера.


Рекомендуем почитать
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 так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.