Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Распределенные сервис-ориентированные системы..pdf
Скачиваний:
10
Добавлен:
05.02.2023
Размер:
9.2 Mб
Скачать

Хотя этот пример во многом является надуманным, он правильно отображает технологию применения исключений на стороне поставщиков сервисов.

5.2.4 Обработка контекста Web-сервиса

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

Если мы хотим в классе Lets7 использовать ссылку на контекст созданной Web-службы SOAP, то начальная часть этого класса должна выглядеть так, как это показано на листинге 5.11.

Листинг 5.11 — Обеспечение доступа к контексту среды в классе Lets7.java

package rsos.lab7; import java.util.List;

import javax.annotation.Resource; import javax.ejb.LocalBean; import javax.ejb.Stateless; import javax.jws.WebService;

import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.TypedQuery;

import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root;

import javax.xml.ws.WebServiceContext;

@WebService

@Stateless

@LocalBean

public class Lets7 implements RemoteLets

{

//Доступ к контексту менеджера сущностей @PersistenceContext(name = "lab4-unit2") private EntityManager em;

//Доступ к контексту среды Web-службы SOAP @Resource

private WebServiceContext context;

//Остальные определения методов класса Lets7

}

Объект контекста имеет множество разных методов. Наиболее важные из них представлены в таблице 5.3.

219

Таблица 5.3. - Методы объектов типа WebServiceContext [17]

Метод

Описание метода

 

 

getMessageContext

Возвращает MessageContext для запроса, который обслуживается

 

на момент вызова метода. Он может быть использован для

 

доступа к различным частям сообщения SOAP.

 

getUserPrincipal

Возвращает Principal, идентифицирующий отправителя запроса.

isUserInRole

Возвращает двоичное значение, указывающее, является ли

 

аутентифицированный

пользователь

представителем

 

определенной логической роли.

 

getEndpointReference

Возвращает EndpointReference, связанный с заданной конечной

 

точкой.

 

 

В качестве примера использования контекста, потребуем, чтобы метод getDeleteLetter(...) мог применяться только пользователем с ролью Admin, что соответственно показано на листинге 5.12.

Листинг 5.12 — Новая реализация метода getDeleteLetter() класса Lets7.java

// Удалить объект из базы данных по ключу

public void deleteLetter(int id) throws Lets7Exception

{

// Проверка на наличие контекста if (context == null)

throw new Lets7Exception(

"Lets7: Контекст среды - недоступен!");

// Проверка роли клиента

if (!context.isUserInRole("Admin")) throw new Lets7Exception(

"Только администратор может удалять письма!");

// Проверка наличия аргумента вызова Letter letter =

em.find(Letter.class, new Integer(id)); if(letter == null)

return;

// Непосредственное обращение на удаление объекта em.remove(letter);

}

Следует обратить внимание, что новая реализация метода не обрабатывает используемое исключение LetsException, поэтому соответствующие изменения должны вноситься в интерфейс RemoteLets.

Конечно, провайдер сервиса может использовать множество других технологических возможностей, предоставляемых сервисами контейнеров сервлетов и EJB-компонент. Мы ограничемся только приведенными примерами и перейдем к реализации потребителя сервиса.

220