Используйте утилиту asadmin для развертывания приложения на GlassFish. После выполнения этой команды будет выведено сообщение о результате выполнения операции развертывания.
$ asadmin deploy — force=true target\chapter08-service-1.0.jar
Теперь, когда EJB развернут вместе с сущностью, вспомогательным классом, а также блоком хранения в GlassFish; Derby запущен, создан источник данных, пришло время, чтобы написать и запустить класс Main.
Написание класса Main
Часто приложения Java EE состоят из веб-приложений, работающих в качестве клиентов для компонентов EJB (это описано в главе 10, где компоненты-подложки JSF будет вызывать EJB). А пока будем использовать обычный класс Java.
Класс Main (листинг 8.18) применяет JNDI для получения контекста InitialContext, чтобы он мог найти интерфейс BookEJBRemote (используя портативное имя JNDI). Помните, что этот класс Main выполняется вне контейнера EJB, поэтому внедрение нельзя осуществить. Метод main() начинает работу с поиска удаленного интерфейса EJB, отображая все книги из базы данных, создает новый экземпляр объекта Book и использует метод EJB createBook() для сохранения этой сущности. Затем он изменяет значение названия книги, обновляет книгу и удаляет ее. Поскольку код этого класса Main не имеет контекста хранения, сущность Book рассматривается как отдельный объект, который обрабатывается как обычный класс Java другим классом Java, без использования JPA. В EJB содержится контекст хранения. Кроме того, он использует менеджер сущностей для доступа к базе данных.
public class Main {
··public static void main(String[] args) throws NamingException {
····// Выполняется поиск EJB
····Context ctx = new InitialContext();
····BookEJBRemote bookEJB = (BookEJBRemote) ctx.lookup("java: global/
····chapter08-service-1.0/BookEJB!org.agoncal.book.javaee7.chapter08.
BookEJBRemote");
····// Получение и отображение всех книг из базы данных
····List
····for (Book aBook: books) {
······System.out.println(aBook);
····}
····// Создается экземпляр книги
····Book book = new Book("H2G2", 12.5F, "Научная фантастика", "1-24561-799-0",
······354, false);
····book = bookEJB.createBook(book);
····System.out.println("Создана книга: " + book);
····book.setTitle("H2G2");
····book = bookEJB.updateBook(book);
····System.out.println("Создана книга: " + book);
····bookEJB.deleteBook(book);
····System.out.println("Книга удалена");
··}
}
Благодаря надстройке Maven Exec просто введите следующую команду, и Maven выполнит класс Main (см. листинг 8.18). Затем вы должны увидеть записи журнала, отображенные в консоли.
$ MVN Exec: Java
Резюме
В этой главе вы узнали, что компоненты, не сохраняющие состояния, и синглтоны имеют одинаковый жизненный цикл, а жизненный цикл компонентов, сохраняющих состояние, несколько отличается. Это потому, что компоненты, сохраняющие состояние, хранят состояние диалога с клиентом и нуждаются в его временной сериализации в надежное хранилище (пассивизации). Аннотации методов обратного вызова позволяют добавить бизнес-логику в ваш компонент до или после того, как произойдет какое-либо событие (@PostConstruct, @PreDestroy и т. д.).
Поскольку в версии EJB 3.1 возможности службы таймера были расширены, теперь она может эффективно конкурировать с другими инструментами планирования. Она происходит от утилиты cron, но более выразительна, что позволяет вам писать сложные, но читаемые выражения для планирования как декларативно, так и программно.
Что касается безопасности, вам следует иметь в виду, что на бизнес-уровне не выполняется авторизация пользователей — здесь происходит управление ролями. Декларативная безопасность поддерживается с помощью относительно небольшого количества аннотаций и позволяет охватить большинство вопросов, касающихся безопасности. Опять же вы можете переключиться на программную защиту и работать с JAAS API.
Глава 9. Транзакции