В данной статья я расскажу, как сконфигурировать проект на JBoss с использование JPA. В подробности JPA, Hibernate, EJB лезть не буду, это отдельная тема. Просто покажу структуру проекта, как настроить datasource на WildFly и все это запустить в IntelliJ IDEA. Данный каркас, я думаю, будет полезен новичкам, работающим с JavaEE и JPA.
Заходим на официальный сайт WildFly и скачиваем версию 10.1.0.Final. (возможно будет работать и другая, но в данном проекте я использовал ее).
Распаковываем архив в любую директорию на вашем компьютере.
Далее создадим нового пользователя. Для этого запускаем bin/add-user.bat. Там все достаточно просто. Следуем инструкциям и запоминаем введенный username и password.
Следующим шагом будет создание 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.
Здесь все стандартно. Думаю лишних комментариев не требуется. Создаем maven проект. В packaging ставим war. И добавляем необходимые зависимости.
Собственно вот мой pom.xml
Обратите внимание, что persitence.xml лежит в WEB-INF->classes->META-INF.
А вот и сам persistence.xml
В качестве jta-data-source используем jndi-name, которое указали при создании datasource.
Если забыли, можно посмотреть на 127.0.0.1:9990 в разделе Configuration->Subsystems->Datasources->Наш datasource->View->Attributes->строка JNDI.
Теперь давайте посмотрим на наши классы.
1. Простейший entity класс.
Подробности не расписываю. Это уже другая тема.
2. EJB класс
Аннотация @PersistenceContext инжектит наш persistence-unit и на его основе создает EntityManager.
Аннотация @Stateless указывает, что это ejb.
3. Простейший Servlet
Аннотация @EJB инжектит JavaBean.
В методе doGet создается пользователь с именем «Ser» и вызывается метод saveUser из ejb.
Если таблицы userentity не было, то hibernate создаст сам таблицу и вставит туда нашего user.
Для настройки jboss в IDEA, заходим в Run->EditConfiguration, нажимаем "+" в левом верхнем углу и выбираем jboss-local.
В качестве ApplicationServer выбираем папку с нашим установленным WildFly. В качестве артифакта я выбрал ExternalArtifact (собранный maven hiberProject.war), убрал стандартный Build и добавил стандартные задачи maven (clean package install).
Теперь жмем старт и ждем когда загрузится сервер. Далее заходим на страницу localhost:8080/имяпроекта/test.
При загрузке страницы срабатывает метод doGet и наш user с именем «Ser» записывается в базу.
Всем спасибо. Надеюсь кому-то эта статья помогла.
Вот ссылка на GitHub с этим проектом.
Установка 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 с этим проектом.
AndreyRubankov
Вот честно, я, как java-разработчик, не совсем понимаю, зачем в современном мире начинать новый проект на базе JavaEE серверов? Даже тот же Spring Boot и то лучше будет.
zesetup
Зато интересно, как оно там в JavaEE делается. Вот, например, можно
без xml-а объявить сервлет и его путь:
Но дальше как-то неуклюже:
Почему void? Понятно, что он пишет ответ в объект resp по старинке, это как-то неявно.
Еще, почему @EJB, а не @ Inject ?
Про Spring, API JAX-RS из JavaEE, по-моему получше выглядит, чем Spring Web c @RestController. По-моему стало бы лучше, если Spring по аннтациям приближался к спецификациям JavaEE. Hibernate хороший пример, он соответствует JPA.
yaushev_st Автор
protected void doGet — это переопределенный метод класса HttpServlet. void наверно потому, что ничего не возвращает.
насчет Inject согласен, можно было в данном случае использовать эту аннотацию.
Как я понимаю, @EJB инжектит только enterprice java beans, а Inject работает со всеми бинами. @EJB целесообразно использовать, когда необходимо передать какие-то допольнительные параметры в аннотацию, относящиеся конкретно к ejb бинам.
vasja0441
Cитуация: продашкшн с IBM-Webshpere || Jboss WildFly || что то типа + DB, Firewall, Monitoring, Cluster, SLA, HA, CI, e.t.c.
Задача: Всё работает, и нужен ещё один сервис, который интегрируется с тучей других
Вопрос: как в минимальные сроки это реализовать?
Допускаю в ситуации выбора «JEE» OR «SpringBoot» зелёный свет дадут первому быстрее, ибо…
...иначе всё что уже работает придётся выкинуть?
ЗЫ
вопрос к Андрею: — а что ещё кроме СпрингБута сегодня в тренде?
osigida
Dropwizard к примеру.
yaushev_st Автор
Сейчас иду на enterprice проект, где требуется Java EE и IBM-Webshpere. Bозможно Spring Boot и лучше, но пока выбирать не приходится.
Throwable