Pull to refresh

JBoss 6.0 + EJB3 для начинающих

Начну пожалуй издалека. Когда то при поступлении на работу, мне выдали тестовое задание, написать простенькое веб приложение с использование EJB. Никаких конкретных требований тогда не было, приложение должно работать, неважно как и неважно на чём. Сначала пытался читать доки, мануалы, различные статьи, но нигде небыло и намека на то как это сделать быстро и качественно. Наткнулся на статью о том как легко и просто можно сделать используя NetBeans+GlassFish. Проект был готов буквально за пару дней из-за невероятного количества приблуд и приятных мелочей, таких как автодеплой проекта, авто-маппинг бинов, создание сущностей и тд и тп. Все это было сделано без вникания, понимания и разбора.

И вот спустя полтора года, возникла задача. Развернуть JBoss + EJB3. Начался активный поиск по различным форумам, чтение документаций и прочее-прочее. 99% примеров это eclipse+какой-то-плагин, что меня в корне не устраивало. Начал копать еще глубже, находил статьи для JBoss 4.2 и EJB2.1 но все это в корне отличалось от сегодняшних технологий. Прошла неделя, и вот, в 04:00 30.04.2011 произошло знаменательное событие, мне удалось запустить полноценное работающее приложение написанное с нуля, на чистой системе.

Пожалуй начну, по порядку и по пунктам, поехали:
  1. Для разработки приложения необходим JBoss 6.0.0 и jdk 1.6. В качестве базы данных была выбрана база MySQL 5.x.x, собиралось все с помощью Apache Ant
  2. Установка JBOSS — распаковываем архив, на этом собственно всё.
  3. Задаём jndi.properties для корректного коннекта к jboss (пригодится в дальнейшем):
    Создаем файл jndi.properties и пишем в него:
    java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
    java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
    java.naming.provider.url=localhost
    Теперь копируем его в %JAVA_HOME%\lib
  4. Скачиваем mysql-jdbc-connector для версии mysql 5.x.x (ну или какую вы там используете) и кидаете в папку %JBOSS_HOME%\server\default\lib
  5. Отлично, дальше учим jboss понимать с какой базой ему предстоит работать.
    Создаем файл mysql-ds.xml и пишем в него:

    <?xml version="1.0" encoding="UTF-8"?>
      <datasources>
        <local-tx-datasource>
          <jndi-name>MySQLDS</jndi-name>
          <connection-url>jdbc:mysql://localhost/library</connection-url>
          <driver-class>com.mysql.jdbc.Driver</driver-class>
          <user-name>root</user-name>
          <password>1234</password>
          <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
        </local-tx-datasource>
        
       </datasources>


    Копируем сюда: %JBOSS_HOME%\server\default\
  6. Создаем пару Entity классов Book и Reader, один session LibraryBean и интерфейс для него Library. Лежат в директории src.my.bean приводить их тут не буду. Ссылка для скачивание примера в конце статьи.
  7. Далее самое интересное, как верно замаппить бины, почему то на всех форумах и всех документациях пишут для jboss 4.2 либо 5.1, что совершенно не подходит для 6.0 (а может и подходит, но руки у меня корявки).
    Создаем persistence.xml и пишем в него:
      <persistence version="2.0"
        xmlns="http://java.sun.com/xml/ns/persistence"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
      <persistence-unit name="example">
        <jta-data-source>java:/MySQLDS</jta-data-source>
          <clаss>my.bean.Book</clаss>
          <clаss>my.bean.Reader</clаss>
        <prоperties>
          <prоperty name="hibernate.hbm2ddl.auto" value="create-drop"/>
        </prоperties>
        </persistence-unit>
      </persistence>


    Копируем его в папку META-INF
  8. Собственно всё. Основные приготовление сделаны. Осталось выполнить следующие команды из папки проетка используя cmd:
    set JAVA_HOME=[путь до JDK]
    set JBOSS_HOME=[путь до вашего любимого jboss]
    ant
  9. Поднимаем сервер, делается легко и просто. Идем в папку %JBOSS_HOME%\bin -> run.bat
  10. В логе сервера должно появится примерно следующее сообщение:
    2011-05-01 02:20:24,253 INFO [org.jboss.ejb3.EJBContainer] (HDScanner) STARTED EJB: my.bean.LibraryBean ejbName: LibraryBean
    2011-05-01 02:20:24,292 INFO [org.jboss.ejb3.proxy.impl.jndiregistrar.JndiSessionRegistrarBase] (HDScanner) Binding the following Entries in Global JNDI:

    LibraryBean/remote - EJB3.x Default Remote Business Interface
    LibraryBean/remote-my.bean.Library - EJB3.x Remote Business Interface


    Это означает что бин успешно подцепился и мы будем при подъёме бинов использовать следующее именование: LibraryBean/remote.
  11. Написание клиента для проверки.
    Собственно писать ничего не надо, всё уже написано. Смотрим в папку src.my.client.Client.java
    Хотелось бы сделать небольшое пояснение, когда создаем InitialContext желательно писать тоже самое что в п.2, а то ничего не заработает.
    Должно получаться что-то вроде такого:
        Properties properties = new Properties();
        properties.put(Context.INITIAL_CONTEXT_FACTORY,
           "org.jnp.interfaces.NamingContextFactory");
        properties.put(Context.PROVIDER_URL, "localhost:1099");
        InitialContext initCont = new InitialContext(properties);


    Ну и обращаемся к бину через созданный контекст initCont.lookup(«LibraryBean/remote»);
  12. Для проверки всего вышесделанного, запускаем клиент. Если все нормально должно появиться сообщение вида: У читателя «Some Person» есть книга «EJB3: hardcore»
  13. На всякий случай приложу дамп базы. Покоится в dump.sql.


  14. Этот пример для профессионалов покажется слишком простым и бесполезным, новичкам же думаю подойдет в самый раз.

    Пример на основе которого написана статья лежит
    здесь.
    Скачать все необходимое, а так же исходники можно тут.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.