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

5.2 Создание Web-служб SOAP

Web-службы SOAP создаются и обеспечиваются провайдерами сервисов, в общем случае, независимо от потребителей сервисов.

В качестве демонстрационного примера выберем EJB-приложение, которое было реализовано в главе 3 данного пособия, когда изучаласть технология JPA. Напомню, что данное приложение демонстрировало работу с базой данных lab4db, где информация храниться, а также обрабатывается в таблице t_letter (см. сценарий создания базы данных lab4db на рисунке 3.5, стр. 149) с помощью двух классов:

а) класс Letter — класс сущности, выполняющий ORM-отображение переменных объектов класса Letter в поля таблицы t_letter;

б) класс Lets2 — полная реализация EJB-приложения, обеспечивающего выполнение операций чтения списка всех хранящихся в базе данных объектов класса Letter, а также выполнение стандартных операций изменения данных таблицы t_lerrer: добавление, удаление, модификацию и извлечение отдельных объектов.

Чтобы не создавать путаницы с предыдущими и последующими примерами, демонстрация создания Web-службы SOAP проводится в отдельном проекте с именем lab7 и описание процесса реализации этой Web-службы разделено на четыре части по пунктам:

1)пункт 5.2.1 — подготовка проекта lab7, куда переносятся уже готовые части программного обеспечения из проекта lab4;

2)пункт 5.2.2 — описываются общие аннотации, используемые поставщиками сервиса и одновременно реализуется сам пример Web-службы;

3)пункт 5.2.3 — приводится информация по обработке исключений, возникающих в программном обеспечении Web-службы;

4)пункт 5.2.4 — приводится информация по обработке контекста, реализованной Web-службы.

5.2.1 Подготовка проекта lab7

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

Шаг 1. Создание проекта типа Dynamic Web Project с именем lab7 и подключение к нему сервера приложений Apache TomEE.

Создание проекта проводится стандартными средствами инструментальной среды Eclipse EE, с указанием того, что система должна сформировать

210

дескриптор развертывания web.xml. Новый проект и новое имя проекта нужно для того чтобы разделить уже созданный софт и максимально исключить все зависимости и ньюансы уже созданных приложений.

Шаг 2. В созаданном проекте открываем класс с именем Letter и именем пакета rsos.lab7.

Напомню, что класс Letter представляет полностью функционирующую сущность для работы с таблицей t_letter базы данных lab4db, поэтому будем использовать ее как основу для создания будущего Web-сервиса, а поскольку этот класс уже реализован в проекте lab4, то копируем из него в новый проект lab7 следующие файлы:

1)Letter.java — правим в нем имя пакета на rsos.lab7;

2)derbyclient.jar — драйвер для работы с СУБД Apache Derby;

3)resources.xml — десриптор ресурсов для соединения с СУБД Apache Derby;

4)pesistence.xml — дескриптор описания юнитов технологи JPA для работы с СУБД Apache Derby.

В файле pesistence.xml правим ссылки на класс Letter, как это показано на листинге 5.3.

Листинг 5.3 — Исходный текст файла persistence.xml проекта lab7

<?xml version="1.0" encoding="UTF-8"?>

<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0"> <persistence-unit name="lab4-unit1" transaction-type="RESOURCE_LOCAL">

<non-jta-data-source>lab4DerbyUnmanaged</non-jta-data-source> <class>rsos.lab7.Letter</class>

</persistence-unit>

<persistence-unit name="lab4-unit2" transaction-type="JTA">

<jta-data-source>lab4Derby</jta-data-source> <non-jta-data-source>lab4DerbyUnmanaged</non-jta-data-source>

<class>rsos.lab7.Letter</class>

</persistence-unit> </persistence>

После проведенных изменений, сущность в виде класса Letter полностью готова для использования ее любым EJB-компонентом программной платформы Java EE.

211

Шаг 3. Подготовка EJB-компонента перед реализацией Web-сервиса.

За основу функционала будущего Web-сервиса возьмем EJB-приложение Lets2, реализованное в проекте lab4 на основе описаний двух интерфейсов:

LocalLetter и RemoteLetter.

Чтобы не порождать конфликтов между активными проектами, которые могут возникнуть при работе с классами и интерфейсами, имеющими одинаковые имена, создадим в проекте lab7:

1)интерфейс RemoteLets, описывающий все методы EJB-приложения и показанный на листинге 5.4;

2)класс Lets7, реализующий методы интерфейса RemoteLets, как EJBкомпонент без сохранения состояния, и показанный на листинге 5.5.

Листинг 5.4 — Исходный текст интерфейса RemoteLets.java проекта lab7

package rsos.lab7;

import java.util.List; import javax.ejb.Remote;

@Remote

public interface RemoteLets

{

//Получить список писем List<Letter> getList();

//Получить письмо по идентификатору Letter getLetter(int id);

//Добавить письмо

void addLetter(Letter letter);

//Удалить письмо по идентификатору void deleteLetter(int id);

//Модифицировать письмо

void modLetter(Letter letter);

}

Листинг 5.5 — Исходный текст EJB-компоненты Lets7.java проекта lab7

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

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;

212

@Stateless

@LocalBean

public class Lets7 implements RemoteLets

{

@PersistenceContext(name = "lab4-unit2") private EntityManager em;

// Получение списка записей таблицы t_letter public List<Letter> getList()

{

//System.out.println("Lets7:getList()...");

//Этап 1. Создаем объект builder CriteriaBuilder builder =

em.getCriteriaBuilder();

//Этап 2. Создаем объект criteria CriteriaQuery<Letter> criteria =

builder.createQuery(Letter.class);

//Этап 3. Создаем объект root

Root<Letter> root = criteria.from(Letter.class);

//Этап 4. Преобразовываем объект criteria,

//включая использование объекта root criteria.select(root);

//Этап 5. Добавляем сортировку

criteria.orderBy(builder.desc(root.get("date")));

//Этап 6. Формируем запрос в виде объекта query TypedQuery<Letter> query = em.createQuery(criteria);

//Этап 7. Получаем результат List<Letter> list =

query.getResultList();

//Этап 8. Обрабатываем результат return list;

}

// Получение объекта по ключу public Letter getLetter(int id) {

Letter l =

em.find(Letter.class, new Integer(id));

return l;

}

//Добавить объект в базу данных public void addLetter(Letter letter) {

em.persist(letter);

}

//Удалить объект из базы данных по ключу public void deleteLetter(int id) {

Letter letter =

213