From 09af0ccdfb9c8072acedf39875f6eef0ea78ba97 Mon Sep 17 00:00:00 2001 From: Fabio Scotto di Santolo Date: Fri, 29 Mar 2019 16:02:49 +0100 Subject: [PATCH 1/3] Aggiunto l'esempio capitolo su Enterprise JavaBean --- ejbdemo/ejbdemo.iml | 42 +++++++++ ejbdemo/pom.xml | 88 +++++++++++++++++++ .../src/main/java/it/plague/jeedemo/Book.java | 35 ++++++++ .../main/java/it/plague/jeedemo/BookEJB.java | 39 ++++++++ .../java/it/plague/jeedemo/BookEJBRemote.java | 16 ++++ .../it/plague/jeedemo/DatabasePopulator.java | 56 ++++++++++++ .../it/plague/jeedemo/DatabaseProducer.java | 12 +++ ejbdemo/src/main/resources/META-INF/beans.xml | 8 ++ .../main/resources/META-INF/persistence.xml | 16 ++++ .../java/it/plague/jeedemo/BookEJBIT.java | 54 ++++++++++++ pom.xml | 7 ++ 11 files changed, 373 insertions(+) create mode 100644 ejbdemo/ejbdemo.iml create mode 100644 ejbdemo/pom.xml create mode 100644 ejbdemo/src/main/java/it/plague/jeedemo/Book.java create mode 100644 ejbdemo/src/main/java/it/plague/jeedemo/BookEJB.java create mode 100644 ejbdemo/src/main/java/it/plague/jeedemo/BookEJBRemote.java create mode 100644 ejbdemo/src/main/java/it/plague/jeedemo/DatabasePopulator.java create mode 100644 ejbdemo/src/main/java/it/plague/jeedemo/DatabaseProducer.java create mode 100644 ejbdemo/src/main/resources/META-INF/beans.xml create mode 100644 ejbdemo/src/main/resources/META-INF/persistence.xml create mode 100644 ejbdemo/src/test/java/it/plague/jeedemo/BookEJBIT.java diff --git a/ejbdemo/ejbdemo.iml b/ejbdemo/ejbdemo.iml new file mode 100644 index 0000000..39dfcd5 --- /dev/null +++ b/ejbdemo/ejbdemo.iml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ejbdemo/pom.xml b/ejbdemo/pom.xml new file mode 100644 index 0000000..9445b13 --- /dev/null +++ b/ejbdemo/pom.xml @@ -0,0 +1,88 @@ + + + + 4.0.0 + ejbdemo + ejbdemo + + + jeedemo + it.plague.jeedemo + 1.0-SNAPSHOT + + + + UTF-8 + 1.7 + 1.7 + + + + + org.eclipse.persistence + org.eclipse.persistence.jpa + + + org.hibernate + hibernate-validator + + + org.glassfish + javax.el + + + org.apache.derby + derbyclient + + + org.apache.derby + derby + test + + + org.projectlombok + lombok + provided + + + org.glassfish.main.extras + glassfish-embedded-all + provided + + + junit + junit + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + 1.7 + 1.7 + + + + org.apache.maven.plugins + maven-failsafe-plugin + 2.12.4 + + + integration-test + + integration-test + verify + + + + + + + diff --git a/ejbdemo/src/main/java/it/plague/jeedemo/Book.java b/ejbdemo/src/main/java/it/plague/jeedemo/Book.java new file mode 100644 index 0000000..f0f7d9b --- /dev/null +++ b/ejbdemo/src/main/java/it/plague/jeedemo/Book.java @@ -0,0 +1,35 @@ +package it.plague.jeedemo; + +import java.io.Serializable; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.NamedQuery; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Entity +@Data +@NoArgsConstructor +@Builder +@NamedQuery(name = "Book.findAll", query = "select b from Book b") +public class Book implements Serializable { + + @Id + @GeneratedValue + private Long id; + @NotNull + @Column(nullable = false) + private String title; + private Float price; + @Size(max = 2000) + @Column(length = 2000) + private String description; + private String isbn; + private Integer nbOfPage; + private Boolean illustrations; +} diff --git a/ejbdemo/src/main/java/it/plague/jeedemo/BookEJB.java b/ejbdemo/src/main/java/it/plague/jeedemo/BookEJB.java new file mode 100644 index 0000000..4fa19e9 --- /dev/null +++ b/ejbdemo/src/main/java/it/plague/jeedemo/BookEJB.java @@ -0,0 +1,39 @@ +package it.plague.jeedemo; + +import java.util.List; +import javax.ejb.LocalBean; +import javax.ejb.Stateless; +import javax.inject.Inject; +import javax.persistence.EntityManager; +import javax.persistence.TypedQuery; +import javax.validation.constraints.NotNull; + +@Stateless +@LocalBean +public class BookEJB implements BookEJBRemote { + + @Inject + private EntityManager em; + + @Override + public List findBooks() { + TypedQuery query = em.createNamedQuery("Book.findAll", Book.class); + return query.getResultList(); + } + + @Override + public @NotNull Book createBook(@NotNull Book book) { + em.persist(book); + return book; + } + + @Override + public @NotNull Book updateBook(@NotNull Book book) { + return em.merge(book); + } + + @Override + public void deleteBook(@NotNull Book book) { + em.remove(em.merge(book)); + } +} diff --git a/ejbdemo/src/main/java/it/plague/jeedemo/BookEJBRemote.java b/ejbdemo/src/main/java/it/plague/jeedemo/BookEJBRemote.java new file mode 100644 index 0000000..523fca0 --- /dev/null +++ b/ejbdemo/src/main/java/it/plague/jeedemo/BookEJBRemote.java @@ -0,0 +1,16 @@ +package it.plague.jeedemo; + +import java.util.List; +import javax.ejb.Remote; + +@Remote +public interface BookEJBRemote { + + List findBooks(); + + Book createBook(Book book); + + void deleteBook(Book book); + + Book updateBook(Book book); +} diff --git a/ejbdemo/src/main/java/it/plague/jeedemo/DatabasePopulator.java b/ejbdemo/src/main/java/it/plague/jeedemo/DatabasePopulator.java new file mode 100644 index 0000000..8ba1f3d --- /dev/null +++ b/ejbdemo/src/main/java/it/plague/jeedemo/DatabasePopulator.java @@ -0,0 +1,56 @@ +package it.plague.jeedemo; + +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; +import javax.annotation.sql.DataSourceDefinition; +import javax.ejb.Singleton; +import javax.ejb.Startup; +import javax.inject.Inject; + + +@Startup +@Singleton +@DataSourceDefinition( + className = "org.apache.derby.jdbc.EmbeddedDataSource", + name = "java:global/jdbc/ejbdemoDS", + user = "app", + password = "app", + databaseName = "ejbdemo", + properties = {"connectionAttributes=;create=true"}) +public class DatabasePopulator { + + @Inject + private BookEJB bookEJB; + + private Book h2g2; + private Book lord; + + @PostConstruct + private void populateDB() { + h2g2 = Book.builder() + .title("Beginning Java EE 7") + .price(35f) + .description("Great book") + .isbn("1-8763-9125-7") + .nbOfPage(605) + .illustrations(true) + .build(); + lord = Book.builder() + .title("The Lord of the Rings") + .price(50.4f) + .description("SciFi") + .isbn("1-84023-742-2") + .nbOfPage(1216) + .illustrations(true) + .build(); + + bookEJB.createBook(h2g2); + bookEJB.createBook(lord); + } + + @PreDestroy + private void clearDB() { + bookEJB.deleteBook(h2g2); + bookEJB.deleteBook(lord); + } +} diff --git a/ejbdemo/src/main/java/it/plague/jeedemo/DatabaseProducer.java b/ejbdemo/src/main/java/it/plague/jeedemo/DatabaseProducer.java new file mode 100644 index 0000000..a9087da --- /dev/null +++ b/ejbdemo/src/main/java/it/plague/jeedemo/DatabaseProducer.java @@ -0,0 +1,12 @@ +package it.plague.jeedemo; + +import javax.enterprise.inject.Produces; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; + +public class DatabaseProducer { + + @Produces + @PersistenceContext(unitName = "ejbdemoPU") + private EntityManager em; +} diff --git a/ejbdemo/src/main/resources/META-INF/beans.xml b/ejbdemo/src/main/resources/META-INF/beans.xml new file mode 100644 index 0000000..5c49eb7 --- /dev/null +++ b/ejbdemo/src/main/resources/META-INF/beans.xml @@ -0,0 +1,8 @@ + + + \ No newline at end of file diff --git a/ejbdemo/src/main/resources/META-INF/persistence.xml b/ejbdemo/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000..ed7b83f --- /dev/null +++ b/ejbdemo/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,16 @@ + + + + + java:global/jdbc/ejbdemoDS + + + + + + + + \ No newline at end of file diff --git a/ejbdemo/src/test/java/it/plague/jeedemo/BookEJBIT.java b/ejbdemo/src/test/java/it/plague/jeedemo/BookEJBIT.java new file mode 100644 index 0000000..5856513 --- /dev/null +++ b/ejbdemo/src/test/java/it/plague/jeedemo/BookEJBIT.java @@ -0,0 +1,54 @@ +package it.plague.jeedemo; + +import static org.junit.Assert.*; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; +import javax.ejb.embeddable.EJBContainer; +import javax.naming.Context; +import org.junit.Test; + +public class BookEJBIT { + + @Test + public void shouldCreateABook() throws Exception { + Map properties = new HashMap<>(); + properties.put(EJBContainer.MODULES, new File("target/classes")); + try (EJBContainer ec = EJBContainer.createEJBContainer(properties)) { + Context ctx = ec.getContext(); + + // Check JNDI dependencies (Datasource and EJBs) + assertNotNull(ctx.lookup("java:global/jdbc/ejbdemoDS")); + assertNotNull(ctx.lookup("java:global/classes/BookEJB!it.plague.jeedemo.BookEJBRemote")); + assertNotNull(ctx.lookup("java:global/classes/BookEJB!it.plague.jeedemo.BookEJB")); + + // Looks up the EJB + BookEJB bookEJB = (BookEJB) ctx.lookup("java:global/classes/BookEJB!it.plague.jeedemo.BookEJB"); + + // Find all the books and makes sure there are two (inserted by the DBPopulator) + assertEquals(2, bookEJB.findBooks().size()); + + // Creates an instance of book; + Book book = Book.builder() + .title("H2G2") + .price(12.5f) + .description("Scifi book") + .isbn("1-24561-799-0") + .nbOfPage(354) + .illustrations(false) + .build(); + book = bookEJB.createBook(book); + assertNotNull("ID should not be null", book.getId()); + + // Find all the books and makes sure is an extra one + assertEquals(3, bookEJB.findBooks().size()); + + // Removes the created book + bookEJB.deleteBook(book); + + // Finds all the books and makes sure there is one less + assertEquals(2, bookEJB.findBooks().size()); + } + } +} diff --git a/pom.xml b/pom.xml index 2ed2870..4f79e02 100644 --- a/pom.xml +++ b/pom.xml @@ -12,6 +12,7 @@ cdidemo beanvalidationdemo jpademo + ejbdemo @@ -47,6 +48,12 @@ derbyclient 10.9.1.0 + + org.glassfish.main.extras + glassfish-embedded-all + 4.0 + provided + org.apache.derby derby From fa1f4fecd31a926c7a3e8523598c3bde5aa5d23f Mon Sep 17 00:00:00 2001 From: Fabio Scotto di Santolo Date: Mon, 1 Apr 2019 08:40:25 +0200 Subject: [PATCH 2/3] Corretti vari errori --- .gitignore | 1 + ejbdemo/ejbdemo.iml | 4 +++- ejbdemo/pom.xml | 6 ++++++ ejbdemo/src/main/java/it/plague/jeedemo/Book.java | 2 ++ .../main/java/it/plague/jeedemo/DatabasePopulator.java | 8 ++++---- ejbdemo/src/test/java/it/plague/jeedemo/BookEJBIT.java | 6 ++++-- pom.xml | 2 +- 7 files changed, 21 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 84f198a..a3faa8c 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ *.zip *.tar.gz *.rar +*.dat # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* diff --git a/ejbdemo/ejbdemo.iml b/ejbdemo/ejbdemo.iml index 39dfcd5..eb85289 100644 --- a/ejbdemo/ejbdemo.iml +++ b/ejbdemo/ejbdemo.iml @@ -17,6 +17,7 @@ + @@ -27,6 +28,7 @@ + @@ -35,7 +37,7 @@ - + diff --git a/ejbdemo/pom.xml b/ejbdemo/pom.xml index 9445b13..ad6d1d7 100644 --- a/ejbdemo/pom.xml +++ b/ejbdemo/pom.xml @@ -24,6 +24,12 @@ org.eclipse.persistence org.eclipse.persistence.jpa + + org.eclipse.persistence + org.eclipse.persistence.jpa.modelgen.processor + 2.5.0 + provided + org.hibernate hibernate-validator diff --git a/ejbdemo/src/main/java/it/plague/jeedemo/Book.java b/ejbdemo/src/main/java/it/plague/jeedemo/Book.java index f0f7d9b..541f323 100644 --- a/ejbdemo/src/main/java/it/plague/jeedemo/Book.java +++ b/ejbdemo/src/main/java/it/plague/jeedemo/Book.java @@ -8,6 +8,7 @@ import javax.persistence.Id; import javax.persistence.NamedQuery; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @@ -15,6 +16,7 @@ import lombok.NoArgsConstructor; @Entity @Data @NoArgsConstructor +@AllArgsConstructor @Builder @NamedQuery(name = "Book.findAll", query = "select b from Book b") public class Book implements Serializable { diff --git a/ejbdemo/src/main/java/it/plague/jeedemo/DatabasePopulator.java b/ejbdemo/src/main/java/it/plague/jeedemo/DatabasePopulator.java index 8ba1f3d..7dd5b01 100644 --- a/ejbdemo/src/main/java/it/plague/jeedemo/DatabasePopulator.java +++ b/ejbdemo/src/main/java/it/plague/jeedemo/DatabasePopulator.java @@ -3,18 +3,18 @@ package it.plague.jeedemo; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.annotation.sql.DataSourceDefinition; -import javax.ejb.Singleton; import javax.ejb.Startup; +import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; @Startup -@Singleton +@ApplicationScoped @DataSourceDefinition( className = "org.apache.derby.jdbc.EmbeddedDataSource", name = "java:global/jdbc/ejbdemoDS", - user = "app", - password = "app", + user = "APP", + password = "APP", databaseName = "ejbdemo", properties = {"connectionAttributes=;create=true"}) public class DatabasePopulator { diff --git a/ejbdemo/src/test/java/it/plague/jeedemo/BookEJBIT.java b/ejbdemo/src/test/java/it/plague/jeedemo/BookEJBIT.java index 5856513..4bff095 100644 --- a/ejbdemo/src/test/java/it/plague/jeedemo/BookEJBIT.java +++ b/ejbdemo/src/test/java/it/plague/jeedemo/BookEJBIT.java @@ -1,6 +1,7 @@ package it.plague.jeedemo; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; import java.io.File; import java.util.HashMap; @@ -24,7 +25,8 @@ public class BookEJBIT { assertNotNull(ctx.lookup("java:global/classes/BookEJB!it.plague.jeedemo.BookEJB")); // Looks up the EJB - BookEJB bookEJB = (BookEJB) ctx.lookup("java:global/classes/BookEJB!it.plague.jeedemo.BookEJB"); + BookEJB bookEJB = (BookEJB) ctx + .lookup("java:global/classes/BookEJB!it.plague.jeedemo.BookEJB"); // Find all the books and makes sure there are two (inserted by the DBPopulator) assertEquals(2, bookEJB.findBooks().size()); diff --git a/pom.xml b/pom.xml index 4f79e02..b11af7c 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ org.glassfish.main.extras glassfish-embedded-all - 4.0 + 4.1 provided From b0d62ac83e470f9ed324c55818a91ece10973fff Mon Sep 17 00:00:00 2001 From: Fabio Scotto di Santolo Date: Mon, 1 Apr 2019 12:13:28 +0200 Subject: [PATCH 3/3] Fix definizione DatabasePopulator come EJB --- .gitignore | 1 + ejbdemo/ejbdemo.iml | 8 ++++---- ejbdemo/pom.xml | 9 --------- .../main/java/it/plague/jeedemo/DatabasePopulator.java | 6 +++--- jpademo/jpademo.iml | 5 ++++- pom.xml | 2 +- 6 files changed, 13 insertions(+), 18 deletions(-) diff --git a/.gitignore b/.gitignore index a3faa8c..0bede59 100644 --- a/.gitignore +++ b/.gitignore @@ -89,3 +89,4 @@ fabric.properties # Android studio 3.1+ serialized cache file .idea/caches/build_file_checksums.ser +/ejbdemo/testdb/ diff --git a/ejbdemo/ejbdemo.iml b/ejbdemo/ejbdemo.iml index eb85289..d94b47a 100644 --- a/ejbdemo/ejbdemo.iml +++ b/ejbdemo/ejbdemo.iml @@ -4,7 +4,9 @@ - + + + @@ -34,10 +36,8 @@ - - - + diff --git a/ejbdemo/pom.xml b/ejbdemo/pom.xml index ad6d1d7..b5408c4 100644 --- a/ejbdemo/pom.xml +++ b/ejbdemo/pom.xml @@ -38,15 +38,6 @@ org.glassfish javax.el - - org.apache.derby - derbyclient - - - org.apache.derby - derby - test - org.projectlombok lombok diff --git a/ejbdemo/src/main/java/it/plague/jeedemo/DatabasePopulator.java b/ejbdemo/src/main/java/it/plague/jeedemo/DatabasePopulator.java index 7dd5b01..9c5ab0c 100644 --- a/ejbdemo/src/main/java/it/plague/jeedemo/DatabasePopulator.java +++ b/ejbdemo/src/main/java/it/plague/jeedemo/DatabasePopulator.java @@ -3,19 +3,19 @@ package it.plague.jeedemo; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.annotation.sql.DataSourceDefinition; +import javax.ejb.Singleton; import javax.ejb.Startup; -import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; @Startup -@ApplicationScoped +@Singleton @DataSourceDefinition( className = "org.apache.derby.jdbc.EmbeddedDataSource", name = "java:global/jdbc/ejbdemoDS", user = "APP", password = "APP", - databaseName = "ejbdemo", + databaseName = "testdb", properties = {"connectionAttributes=;create=true"}) public class DatabasePopulator { diff --git a/jpademo/jpademo.iml b/jpademo/jpademo.iml index 13d6ecc..43e53ae 100644 --- a/jpademo/jpademo.iml +++ b/jpademo/jpademo.iml @@ -4,7 +4,10 @@ - + + + + diff --git a/pom.xml b/pom.xml index b11af7c..99ef36d 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ org.glassfish.main.extras glassfish-embedded-all - 4.1 + 4.1.2 provided