Статьи

Учебник по интеграции GWT EJB3 Maven JBoss 5.1

Привет всем,

В этой статье мы собираемся продемонстрировать, как правильно интегрировать GWT и EJB3 , чтобы реализовать пример проекта, собрать его с помощью maven и развернуть на сервере приложений JBoss 5.1 . На самом деле вы можете легко изменить зависимости в файле сборки maven и развернуть проект на своем любимом сервере приложений. Чтобы быть как можно более универсальными, мы будем использовать командную строку maven и текстовый редактор gedit.

Сначала мы должны создать проект POM . Мы назовем это ejb-gwt.

1
2
3
mkdir ejb-gwt
cd ejb-gwt
gedit pom.xml

pom.xml

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
  <modelversion>4.0.0</modelversion>
  <groupid>com.javacodegeeks</groupid>
  <artifactid>ejb-gwt</artifactid>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>
  <name>ejb-gwt</name>
  <properties>
    <project.build.sourceencoding>UTF-8</project.build.sourceencoding>
  </properties>
  <dependencies>
  </dependencies>
  <modules>
  </modules>
 <build>
  <plugins>
   <plugin>
    <groupid>org.apache.maven.plugins</groupid>
    <artifactid>maven-compiler-plugin</artifactid>
    <configuration>
     1.6
     <target>1.6</target>
    </configuration>
   </plugin>
  </plugins>
 </build>
</project>

Затем мы создадим модуль, который будет содержать классы ejb. Мы назовем это ejb-jar.

1
2
3
4
5
6
7
mvn archetype:create -DgroupId=com.javacodegeeks -DartifactId=ejb-jar
cd ejb-jar/src/main
mkdir resources
cd resources
mkdir META-INF
cd META-INF
gedit persistence.xml

Мы настроим файл persistence.xml для использования источника данных по умолчанию jboss.

persistence.xml

01
02
03
04
05
06
07
08
09
10
11
  <persistence-unit name="MyPersistenceUnit">
  <provider>org.hibernate.ejb.HibernatePersistence</provider>
  <jta-data-source>java:/DefaultDS</jta-data-source>
   <properties>
   <property name="hibernate.hbm2ddl.auto" value="update">
   <property name="hibernate.show_sql" value="true">
   <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect">
  </property></property></property></properties>
 </persistence-unit>
</persistence>

В src / java вы разместите свой ejb-код. В нашем примере у нас есть бин сущности

Employee.java

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package com.javacodegeeks.ejb.entity;
 
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
 
@Entity
@Table(name = "EMPLOYEE")
public class Employee implements java.io.Serializable {
  
 private static final long serialVersionUID = 7440297955003302414L;
 
 @Id
 @Column(name="employee_id")
 private long employeeId;
  
 @Column(name="employee_name", nullable = false, length=30)
 private String employeeName;
  
 @Column(name="employee_surname", nullable = false, length=30)
 private String employeeSurname;
  
 @Column(name="job", length=50)
 private String job;
   
 public Employee() {
 }
 
 public Employee(int employeeId) {
  this.employeeId = employeeId; 
 }
 
 public Employee(long employeeId, String employeeName, String employeeSurname,
   String job) {
  this.employeeId = employeeId;
  this.employeeName = employeeName;
  this.employeeSurname = employeeSurname;
  this.job = job;
 }
 
 public long getEmployeeId() {
  return employeeId;
 }
 
 public void setEmployeeId(long employeeId) {
  this.employeeId = employeeId;
 }
 
 public String getEmployeeName() {
  return employeeName;
 }
 
 public void setEmployeeName(String employeeName) {
  this.employeeName = employeeName;
 }
 
 public String getEmployeeSurname() {
  return employeeSurname;
 }
 
 public void setEmployeeSurname(String employeeSurname) {
  this.employeeSurname = employeeSurname;
 }
 
 public String getJob() {
  return job;
 }
 
 public void setJob(String job) {
  this.job = job;
 }
}

Локальный интерфейс сессионного компонента.

EmployeeService.java

01
02
03
04
05
06
07
08
09
10
11
package com.javacodegeeks.ejb.session;
 
import com.javacodegeeks.ejb.entity.Employee;
 
public interface EmployeeService {
 public Employee findEmployee(long employeeId);
 public void saveEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception;
 public void updateEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception;
 public void saveOrUpdateEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception;
 public void deleteEmployee(long employeeId) throws Exception;
}

И, наконец, сессионный компонент.

EmployeeServiceBean.java

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package com.javacodegeeks.ejb.session;
 
import javax.ejb.Local;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
 
import com.javacodegeeks.ejb.entity.Employee;
 
@Stateless(name = "employeeService")
@Local(EmployeeService.class)
public class EmployeeServiceBean implements EmployeeService {
 @PersistenceContext
 private EntityManager entityManager;
 
 public void deleteEmployee(long employeeId) throws Exception {
  entityManager.remove(entityManager.find(Employee.class, employeeId));
 }
 
 public Employee findEmployee(long employeeId) {
  return entityManager.find(Employee.class, employeeId);
 }
 
 public void saveEmployee(long employeeId, String name, String surname,
   String jobDescription) throws Exception {
  Employee emp = new Employee();
  emp.setEmployeeId(employeeId);
  emp.setEmployeeName(name);
  emp.setEmployeeSurname(surname);
  emp.setJob(jobDescription);
   
  entityManager.persist(emp);
 
 }
 
 public void saveOrUpdateEmployee(long employeeId, String name,
   String surname, String jobDescription) throws Exception {
  Employee emp = new Employee();
  emp.setEmployeeId(employeeId);
  emp.setEmployeeName(name);
  emp.setEmployeeSurname(surname);
  emp.setJob(jobDescription);
   
  entityManager.merge(emp);
 }
 
 public void updateEmployee(long employeeId, String name, String surname,
   String jobDescription) throws Exception {
  Employee emp = entityManager.find(Employee.class, employeeId);
  emp.setEmployeeName(name);
  emp.setEmployeeSurname(surname);
  emp.setJob(jobDescription);
   
  entityManager.merge(emp);
 }
 
}

Pom.xml модуля ejb-jar должен быть:

pom.xml

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
  <modelversion>4.0.0</modelversion>
  <parent>
    <artifactid>ejb-gwt</artifactid>
    <groupid>com.javacodegeeks</groupid>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <groupid>com.javacodegeeks</groupid>
  <artifactid>ejb-jar</artifactid>
  <version>0.0.1-SNAPSHOT</version>
  <name>ejb-jar</name>
  <packaging>ejb</packaging>
 
  <repositories>
   <repository>
    <id>jboss-maven2</id>
    </repository>
  </repositories>
 
  <dependencies>
   <dependency>
     <groupid>org.jboss.jbossas</groupid>
     <artifactid>jboss-as-client</artifactid>
     <version>5.1.0.GA</version>
     <type>pom</type>
     <scope>provided</scope>
 </dependency>
   <dependency>
      <groupid>junit</groupid>
      <artifactid>junit</artifactid>
      <version>4.7</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <plugins>
        <plugin>
            <groupid>org.apache.maven.plugins</groupid>
            <artifactid>maven-ejb-plugin</artifactid>
            <configuration>
                <ejbversion>3.0</ejbversion>
            </configuration>
        </plugin>
    </plugins>
</build>
</project>

Теперь мы создадим наш веб-проект на основе gwt-maven-plugin archertype.

1
2
3
mvn archetype:generate -DarchetypeGroupId=org.codehaus.mojo -DarchetypeArtifactId=gwt-maven-plugin -DarchetypeVersion=1.2    -DgroupId=com.javacodegeeks    -DartifactId=war
cd war
gedit pom.xml

pom.xml

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
   
  <modelversion>4.0.0</modelversion>
  <parent>
        <artifactid>ejb-gwt</artifactid>
        <groupid>com.javacodegeeks</groupid>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
  <groupid>com.javacodegeeks</groupid>
  <artifactid>war</artifactid>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <properties>
      <gwt.version>2.0.4</gwt.version>
      <maven.compiler.source>1.6</maven.compiler.source>
      <maven.compiler.target>1.6</maven.compiler.target>
  </properties>
  <dependencies>
    <dependency>
      <groupid>com.google.gwt</groupid>
      <artifactid>gwt-servlet</artifactid>
      <version>${gwt.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupid>com.google.gwt</groupid>
      <artifactid>gwt-user</artifactid>
      <version>${gwt.version}</version
      <scope>provided</scope>
    </dependency>
    <dependency>
     <groupid>org.jboss.jbossas</groupid>
     <artifactid>jboss-as-client</artifactid>
     <version>5.1.0.GA</version>
     <type>pom</type>
     <scope>provided</scope>
 </dependency>
 <dependency>
    <groupid>com.javacodegeeks</groupid>
    <artifactid>ejb-jar</artifactid>
    <version>0.0.1-SNAPSHOT</version>
    <type>ejb</type>
    <scope>provided</scope>
   </dependency>
    <dependency>
      <groupid>junit</groupid>
      <artifactid>junit</artifactid>
      <version>4.7</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
  <finalname>war</finalname>
    <outputdirectory>war/WEB-INF/classes</outputdirectory>
    <plugins>
      <plugin>
        <groupid>org.codehaus.mojo</groupid>
        <artifactid>gwt-maven-plugin</artifactid>
        <version>1.2</version>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>
              <goal>generateAsync</goal>
              <goal>test</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <runtarget>com.javacodegeeks.war.Application/Application.html</runtarget>
        </configuration>
      </plugin>
      <plugin>
          <groupid>org.apache.maven.plugins</groupid>
          <artifactid>maven-compiler-plugin</artifactid>
          <version>2.0.2</version>
          <configuration>
            ${maven.compiler.source}
            <target>${maven.compiler.target}</target>
          </configuration>
      </plugin>
    </plugins>
  </build>
 
</project>
1
2
cd src/main/webapp/WEB-INF
gedit web.xml

web.xml

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
 <display-name>GWT-Maven-Archetype</display-name>
 <servlet>
    <servlet-name>emp</servlet-name>
    <servlet-class>com.javacodegeeks.war.server.services.EmployeeServiceGWTImpl</servlet-class>
  </servlet>
   
  <servlet-mapping>
    <servlet-name>emp</servlet-name>
    <url-pattern>/com.javacodegeeks.war.Application/emp</url-pattern>
  </servlet-mapping>
 <welcome-file-list>
  <welcome-file>index.html</welcome-file>
 </welcome-file-list>
</web-app>

web.xml должен применяться со спецификацией 2.5, если мы хотим сделать ejb-инъекцию в контейнере сервлета.

Теперь давайте посмотрим на сервис gwt.

EmployeeServiceGWT.java

01
02
03
04
05
06
07
08
09
10
11
12
13
14
package com.javacodegeeks.war.shared.services;
 
import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
import com.javacodegeeks.war.shared.entity.EmployeeUtil;
 
@RemoteServiceRelativePath("emp")
public interface EmployeeServiceGWT  extends RemoteService  {
 public EmployeeUtil findEmployee(long employeeId);
 public void saveEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception;
 public void updateEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception;
 public void saveOrUpdateEmployee(long employeeId, String name, String surname, String jobDescription) throws Exception;
 public void deleteEmployee(long employeeId) throws Exception;
}

Обратите внимание, что RemoteServiceRelativePath связан с путем сервлета /com.javacodegeeks.war.Application/emp, который мы определили в файле web.xml.

EmployeeServiceGWTImpl.java

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package com.javacodegeeks.war.server.services;
 
import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.transaction.UserTransaction;
 
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.javacodegeeks.ejb.entity.Employee;
import com.javacodegeeks.ejb.session.EmployeeService;
import com.javacodegeeks.war.shared.entity.EmployeeUtil;
import com.javacodegeeks.war.shared.services.EmployeeServiceGWT;
 
public class EmployeeServiceGWTImpl extends RemoteServiceServlet implements EmployeeServiceGWT{
 
 /**
  *
  */
 private static final long serialVersionUID = 5995064321382986251L;
  
 private EmployeeService employeeService;
 @Resource(name="java:UserTransaction") UserTransaction ut;
 
 
  
 @EJB
 public void setEmployeeService(EmployeeService employeeService) {
  this.employeeService = employeeService;
 }
 
 public void deleteEmployee(long employeeId) throws Exception {
  employeeService.deleteEmployee(employeeId);
   
 }
 
 public EmployeeUtil findEmployee(long employeeId) {
   
  Employee emp = employeeService.findEmployee(employeeId);
  if(emp != null) {
   try {
    ut.begin();
    EmployeeUtil util = new EmployeeUtil(emp.getEmployeeId(), emp.getEmployeeName(), emp.getEmployeeSurname(), emp.getJob());
     
    ut.commit();
    return util;
   } catch (Exception e) {
   }
    
  }
  return null;
 }
 
 public void saveEmployee(long employeeId, String name, String surname,
   String jobDescription) throws Exception {
  employeeService.saveEmployee(employeeId, name, surname, jobDescription);
   
 }
 
 public void saveOrUpdateEmployee(long employeeId, String name,
   String surname, String jobDescription) throws Exception {
  employeeService.saveOrUpdateEmployee(employeeId, name, surname, jobDescription);
   
 }
 
 public void updateEmployee(long employeeId, String name, String surname,
   String jobDescription) throws Exception {
  employeeService.updateEmployee(employeeId, name, surname, jobDescription);
   
 }
 
}

Как видите, мы внедряем сессионный компонент employeeService с помощью аннотации @EJB.
Обратите внимание, что мы используем класс EmployeeUtil по основной причине :
GWT не может обрабатывать отложенные инициализированные отношения, поэтому мы заменяем коллекцию прокси реальными коллекциями. Замена должна находиться в области транзакции.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package com.javacodegeeks.war.shared.entity;
 
import java.io.Serializable;
 
public class EmployeeUtil implements Serializable  {
  
 /**
  *
  */
 private static final long serialVersionUID = -2732740011239267035L;
 
 private long employeeId;
  
 private String employeeName;
  
 private String employeeSurname;
  
 private String job;
  
  
 public EmployeeUtil() {
 }
 
 public EmployeeUtil(int employeeId) {
  this.employeeId = employeeId; 
 }
 
 public EmployeeUtil(long employeeId, String employeeName, String employeeSurname,
   String job) {
  this.employeeId = employeeId;
  this.employeeName = employeeName;
  this.employeeSurname = employeeSurname;
  this.job = job;
 }
 
 public long getEmployeeId() {
  return employeeId;
 }
 
 public void setEmployeeId(long employeeId) {
  this.employeeId = employeeId;
 }
 
 public String getEmployeeName() {
  return employeeName;
 }
 
 public void setEmployeeName(String employeeName) {
  this.employeeName = employeeName;
 }
 
 public String getEmployeeSurname() {
  return employeeSurname;
 }
 
 public void setEmployeeSurname(String employeeSurname) {
  this.employeeSurname = employeeSurname;
 }
 
 public String getJob() {
  return job;
 }
 
 public void setJob(String job) {
  this.job = job;
 }
 
}

Остальная часть исходного кода для интерфейса gwt приведена в исходном коде этой статьи.

Теперь у нас есть последний шаг, чтобы построить ухо. Мы создадим модуль для этого.

1
2
3
4
mvn archetype:create -DgroupId=com.javacodegeeks -DartifactId=ear
cd ear
rm -rf src
gedit pom.xml

pom.xml

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
  <modelversion>4.0.0</modelversion>
  <parent>
    <artifactid>ejb-gwt</artifactid>
    <groupid>com.javacodegeeks</groupid>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <groupid>com.javacodegeeks</groupid>
  <artifactid>ear</artifactid>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>ear</packaging>
  <name>ear</name>
  <description>ear for gwt ejb3</description>
  <dependencies>
   <dependency>
    <groupid>com.javacodegeeks</groupid>
    <artifactid>ejb-jar</artifactid>
    <version>0.0.1-SNAPSHOT</version>
    <type>ejb</type>
   </dependency>
    <dependency>
    <groupid>com.javacodegeeks</groupid>
    <artifactid>war</artifactid>
    <version>0.0.1-SNAPSHOT</version>
    <type>war</type>
   </dependency>
  </dependencies>
 
 <build>
    <plugins>
      <plugin>
        <groupid>org.apache.maven.plugins</groupid>
        <artifactid>maven-ear-plugin</artifactid>
        <configuration>
          <generateapplicationxml>true</generateapplicationxml>
          <modules>
            <webmodule>
              <groupid>com.javacodegeeks</groupid>
              <artifactid>war</artifactid>
              <contextroot>ejb-gwt</contextroot>
            </webmodule>
            <ejbmodule>
              <groupid>com.javacodegeeks</groupid>
              <artifactid>ejb-jar</artifactid>
            </ejbmodule>
         </modules>
       </configuration>
     </plugin>
   </plugins>
  </build>
</project>

Для создания проекта перейдите в корневой проект и введите:
установить mvn

Исходный код этой статьи находится здесь .

Спасибо

./pat

Статьи по Теме :