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

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

>····

>··

>

Но если вы хотите создать более точное сообщение об ошибке SOAP с другим значением faultCode и т. д., то можете использовать API javax.xml.soap.SOAPFactory для создания объекта типа javax.xml.soap.SOAPFault (это показано в листинге 14.25).


Листинг 14.25. Проверка использует SOAPFactory для создания SOAPFault

>@WebService

>public class CardValidator {

>··public boolean validate(CreditCard creditCard) {

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

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


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

>······return true;

>····}··else {

>······SOAPFactory soapFactory = SOAPFactory.newInstance();

>······SOAPFault fault = soapFactory.createFault("Неверный номер 

>············кредитной карты", new QName("ValidationFault"));

>······throw new CardValidatorException(fault);

>····}

>··}

>}

В листинге 14.25 создается объект типа SOAPFault с текстом Номер кредитной карты недействителен и кодом ошибки (ValidationFault), формирующим конверт SOAP (листинг 14.26).


Листинг 14.26. Объект SOAPFault, создающий конверт SOAP

>

>··

>····

>······ValidationFault

>······Неверный номер кредитной карты

>····

>··

>

Жизненный цикл и функции обратного вызова

Как вы можете видеть на рис. 14.4, веб-службы SOAP также имеют жизненный цикл, который напоминает управляемые компоненты. Такой жизненный цикл присущ компонентам, не хранящим состояния: либо они не существуют, либо готовы обрабатывать запрос. Этим жизненным циклом управляет контейнер.


Рис. 14.4. Жизненный цикл веб-службы SOAP


Конечные точки-сервлеты и EJB поддерживают внедрение зависимостей (потому что работают в контейнере) и методы жизненного цикла, такие как @PostConstruct и @PreDestroy. Контейнер вызывает метод обратного вызова @PostConstruct, если таковой существует, когда создает экземпляр веб-службы, и вызывает метод обратного вызова @PreDestroy при его разрушении. Одно из различий между типами конечных точек заключается в том, что могут использовать перехватчики (описанные в главе 2).

WebServiceContext

Веб-службы SOAP имеют контекст среды и могут получить доступ к нему при добавлении ссылки на javax.xml.ws.WebServiceContext с аннотацией @Resource. Внутри этого контекста веб-служба во время выполнения может получить информацию, такую как класс конечной реализации, контекст сообщения и информацию о безопасности относительно обслуживаемого запроса.


Примечание

Спецификации JAX-WS и WS-Metadata не были обновлены в Java EE 7, поэтому, даже если ваше приложение использует CDI, вы не можете задавать аннотацию @Inject, чтобы внедрить WebServiceContext: вам все равно придется обратиться к аннотации @Resource.


Код в листинге 14.27 использует WebServiceContext, чтобы узнать, имеет ли вызывающая сторона роль Admin для проверки кредитной карты. В табл. 14.6 перечислены методы, определенные в интерфейсе javax.xml.ws.WebServiceContext.


Листинг 14.27. Веб-служба SOAP, использующая WebServiceContext

>@WebService

>public class CardValidator {

>··@Resource

>··private WebServiceContext context;


>··public boolean validate(CreditCard creditCard) {

>····if (!context.isUserInRole("Admin"))

>······throw new SecurityException("Только администратор может проверить карту");

>····// Бизнес-логика

>····}

>··}


Таблица 14.6. Методы интерфейса WebServiceContext
МетодОписание
getMessageContextВозвращает MessageContext для запроса, обслуживаемого в момент вызова метода. Может быть использован для доступа к частям сообщения SOAP: к заголовку, телу и т. д.
getUserPrincipalВозвращает Principal, идентифицирующий отправителя запроса, который обслуживается в данный момент
isUserInRoleВозвращает двоичное значение, указывающее, является ли аутентифицированный пользователь представителем определенной логической роли
getEndpointReferenceВозвращает EndpointReference, связанный с заданной конечной точкой

Дескриптор развертывания

Как и большинство технологий Java EE 7, веб-службы SOAP позволяют определить метаданные с использованием аннотаций (то, что мы делали во всех примерах), а также с помощью XML. Расположенный в каталоге WEB-INF файл webservices.xml замещает или дополняет аннотации. Как и большинство дескрипторов развертывания в Java EE 7, файл webservices.xml обязателен, поскольку аннотации могут быть использованы для указания большей части данных, заданных в этом дескрипторе развертывания. Например, в листинге 14.28 показано, как можно переопределить порт WSDL (OverriddenPort) для веб-службы CardValidator.


Листинг 14.28. Дескриптор развертывания webservices.xml

>

>·············xmlns: xsi="http://www.w3.org/2001/XMLSchema-instance" 

>·············xsi: schemaLocation="http://java.sun.com/xml/ns/javaee 

>·············http://java.sun.com/xml/ns/javaee/javaee_web_services_1_3.xsd" 

>·············version="1.3">


>··

>····CardValidatorWS


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