В данной статья я расскажу, как сконфигурировать проект на JBoss с использование JPA. В подробности JPA, Hibernate, EJB лезть не буду, это отдельная тема. Просто покажу структуру проекта, как настроить datasource на WildFly и все это запустить в IntelliJ IDEA. Данный каркас, я думаю, будет полезен новичкам, работающим с JavaEE и JPA.

Установка WildFly10


Заходим на официальный сайт WildFly и скачиваем версию 10.1.0.Final. (возможно будет работать и другая, но в данном проекте я использовал ее).

Распаковываем архив в любую директорию на вашем компьютере.
Далее создадим нового пользователя. Для этого запускаем bin/add-user.bat. Там все достаточно просто. Следуем инструкциям и запоминаем введенный username и password.

Создание datasource


Следующим шагом будет создание datasource на сервере. Самым простым способом будет использование консоли администратора, предоставляемой WildFly.

Для того чтобы в нее зайти, сначала нужно запустить сервер /bin/standalone.bat и перейти по адресу 127.0.0.1:9990. Используем имя пользователя и пароль, которые только что создали.

Идем в раздел Deployments->Add->Upload a new deployment.

Теперь скачиваем jdbc драйвер с официального сайте postgresql. Я скачал postgresql-42.2.4.jar. Его добавляем в deployments. Имя можно дать любое.

Далее Configuration->Subsystems->Datasources->Non-XA->Add.

Выбираем Postgresql Datasource и наш скачанный драйвер. Задаем url нашей базы, логин и пароль. (не путать с логином и паролем от сервера). Если все сделали правильно, то должен появиться ваш новый datasource в списке. Во вкладке View вы можете проверить соединение с базой, если нажмете Test Connection.

Создаем проект в IntelliJ IDEA


Здесь все стандартно. Думаю лишних комментариев не требуется. Создаем maven проект. В packaging ставим war. И добавляем необходимые зависимости.

Собственно вот мой pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>yst</groupId>
    <artifactId>hiberProject</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <dependencies>

        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.2.12.Final</version>
            <scope>provided</scope>
        </dependency>


    </dependencies>

    <build>
        <finalName>hiberProject</finalName>
    </build>


</project>

Структура проекта




Обратите внимание, что persitence.xml лежит в WEB-INF->classes->META-INF.

А вот и сам persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<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 http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

    <persistence-unit name="myUnit" >
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <jta-data-source>java:/PostgresDS</jta-data-source>
        <class>UserEntity</class>
        <class>JavaBean</class>
        <properties>
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.hbm2ddl.auto" value="update" />

        </properties>
    </persistence-unit>

</persistence>

В качестве jta-data-source используем jndi-name, которое указали при создании datasource.
Если забыли, можно посмотреть на 127.0.0.1:9990 в разделе Configuration->Subsystems->Datasources->Наш datasource->View->Attributes->строка JNDI.

Теперь давайте посмотрим на наши классы.

1. Простейший entity класс.

Подробности не расписываю. Это уже другая тема.

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;


@Entity
public class UserEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

2. EJB класс

Аннотация @PersistenceContext инжектит наш persistence-unit и на его основе создает EntityManager.

Аннотация @Stateless указывает, что это ejb.

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;



@Stateless
public class JavaBean {

    @PersistenceContext(unitName = "myUnit")
    EntityManager entityManager;

    public void saveUser(UserEntity user){
        entityManager.persist(user);

    }

}

3. Простейший Servlet

Аннотация @EJB инжектит JavaBean.

В методе doGet создается пользователь с именем «Ser» и вызывается метод saveUser из ejb.
Если таблицы userentity не было, то hibernate создаст сам таблицу и вставит туда нашего user.

import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


@WebServlet("/test")
public class App extends HttpServlet{

    @EJB
    JavaBean javaBean;


    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        UserEntity user=new UserEntity();
        user.setName("Ser");

        javaBean.saveUser(user);

        resp.getWriter().println("Hello from servlet");
    }
}

Запуск проекта


Для настройки jboss в IDEA, заходим в Run->EditConfiguration, нажимаем "+" в левом верхнем углу и выбираем jboss-local.



В качестве ApplicationServer выбираем папку с нашим установленным WildFly. В качестве артифакта я выбрал ExternalArtifact (собранный maven hiberProject.war), убрал стандартный Build и добавил стандартные задачи maven (clean package install).

Теперь жмем старт и ждем когда загрузится сервер. Далее заходим на страницу localhost:8080/имяпроекта/test.

При загрузке страницы срабатывает метод doGet и наш user с именем «Ser» записывается в базу.

Всем спасибо. Надеюсь кому-то эта статья помогла.
Вот ссылка на GitHub с этим проектом.

Комментарии (8)


  1. AndreyRubankov
    22.08.2018 09:56

    Вот честно, я, как java-разработчик, не совсем понимаю, зачем в современном мире начинать новый проект на базе JavaEE серверов? Даже тот же Spring Boot и то лучше будет.


    1. zesetup
      22.08.2018 10:22

      Зато интересно, как оно там в JavaEE делается. Вот, например, можно
      без xml-а объявить сервлет и его путь:


      @WebServlet("/test")

      Но дальше как-то неуклюже:


      protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

      Почему void? Понятно, что он пишет ответ в объект resp по старинке, это как-то неявно.


      Еще, почему @EJB, а не @ Inject ?


      Про Spring, API JAX-RS из JavaEE, по-моему получше выглядит, чем Spring Web c @RestController. По-моему стало бы лучше, если Spring по аннтациям приближался к спецификациям JavaEE. Hibernate хороший пример, он соответствует JPA.


      1. yaushev_st Автор
        22.08.2018 21:39

        protected void doGet — это переопределенный метод класса HttpServlet. void наверно потому, что ничего не возвращает.

        насчет Inject согласен, можно было в данном случае использовать эту аннотацию.

        Как я понимаю, @EJB инжектит только enterprice java beans, а Inject работает со всеми бинами. @EJB целесообразно использовать, когда необходимо передать какие-то допольнительные параметры в аннотацию, относящиеся конкретно к ejb бинам.


    1. vasja0441
      22.08.2018 10:31

      Cитуация: продашкшн с IBM-Webshpere || Jboss WildFly || что то типа + DB, Firewall, Monitoring, Cluster, SLA, HA, CI, e.t.c.
      Задача: Всё работает, и нужен ещё один сервис, который интегрируется с тучей других
      Вопрос: как в минимальные сроки это реализовать?

      Допускаю в ситуации выбора «JEE» OR «SpringBoot» зелёный свет дадут первому быстрее, ибо…
      ...иначе всё что уже работает придётся выкинуть?


      ЗЫ
      вопрос к Андрею: — а что ещё кроме СпрингБута сегодня в тренде?


      1. osigida
        22.08.2018 22:25

        Dropwizard к примеру.


    1. yaushev_st Автор
      22.08.2018 21:25

      Сейчас иду на enterprice проект, где требуется Java EE и IBM-Webshpere. Bозможно Spring Boot и лучше, но пока выбирать не приходится.


      1. Throwable
        23.08.2018 10:19

        Сейчас иду на enterprice проект, где требуется Java EE и IBM-Webshpere
        Искренне сочуствую!
        Возьмите Spring (не boot), напишите на нем стандартное приложение, погоняйте, потестируйте. Затем сделайте отдельную конфигурацию контекста для деплоя на JEE сервер. Поверьте, так будет лучше. Многие, кто пишут под JEE, делают это на спринге.


  1. osigida
    22.08.2018 22:27

    Мне кажется «простой» неуместно использовать в заголовке такой статьи.