From 0c36f23220e5d3ede305c5fb077a24b83278f835 Mon Sep 17 00:00:00 2001 From: Emmanuel Bruno <emmanuel.bruno@univ-tln.fr> Date: Tue, 30 Nov 2021 09:19:04 +0100 Subject: [PATCH] cleans and improves JPA. --- README.md | 21 ++++++--- .../univtln/bruno/samples/jee91/dao/DAO2.java | 20 --------- .../jee91/dao/{DAO1.java => MainDAO.java} | 2 +- .../bruno/samples/jee91/dao/Person.java | 14 ------ .../bruno/samples/jee91/dao/PersonDAO.java | 31 +++++++++++++ .../EntityManagerProducer.java | 2 +- .../H2Database.java | 2 +- .../PostgreSQLDatabase.java | 2 +- entites/pom.xml | 4 ++ .../bruno/samples/jee91/dao/Person.java | 24 +++++++++- .../samples/jee91/rs/SampleResource.java | 45 ++++++++++++------- restApp/src/main/resources/insert.sql | 8 ++-- .../bruno/samples/jee91/ws/WSServer.java | 4 +- wsApp/src/main/webapp/WEB-INF/beans.xml | 6 --- 14 files changed, 111 insertions(+), 74 deletions(-) delete mode 100644 dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/DAO2.java rename dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/{DAO1.java => MainDAO.java} (95%) delete mode 100644 dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/Person.java create mode 100644 dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/PersonDAO.java rename dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/{ => entitymanagersproducers}/EntityManagerProducer.java (81%) rename dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/{ => entitymanagersproducers}/H2Database.java (84%) rename dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/{ => entitymanagersproducers}/PostgreSQLDatabase.java (84%) delete mode 100644 wsApp/src/main/webapp/WEB-INF/beans.xml diff --git a/README.md b/README.md index 7f6dc37..78b6167 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,21 @@ # Project fr.univtln.bruno.samples/jee9.1 -Steps to run this project: +## Steps to run this project 1. COMPOSE_DOCKER_CLI_BUILD=1 DOCKER_BUILDKIT=1 docker-compose up --build -d 2. Visit - 1. curl http://localhost:8080/jee9.1/resources/sample - 2. curl http://localhost:8080/jee9.1/resources/sample/hello - 3. curl http://localhost:8080/jee9.1/resources/sample/dao1 - 4. curl http://localhost:8080/jee9.1/resources/sample/dao2 + 1. curl http://localhost:8080/restApp-1.0-SNAPSHOT/resources/sample + 2. curl http://localhost:8080/restApp-1.0-SNAPSHOT/resources/sample/hello + 3. curl http://localhost:8080/restApp-1.0-SNAPSHOT/resources/sample/main + 4. curl http://localhost:8080/restApp-1.0-SNAPSHOT/resources/sample/persons + 5. curl -H "Content-Type: application/json" \ + -X POST \ + -d '{"name":"Jeanne"}' \ + http://localhost:8080/restApp-1.0-SNAPSHOT/resources/sample/persons + 6. curl http://localhost:8080/restApp-1.0-SNAPSHOT/resources/sample/persons/843c8236-6c6b-450e-9aa3-211a9b897403 + 7. curl -H "Accept: text/xml" http://localhost:8080/restApp-1.0-SNAPSHOT/resources/sample/persons +## Import "real" certificate -openssl x509 -outform der -in localhost.pem -out localhost.der -keytool -import -noprompt -trustcacerts -storepass storepass -alias localhost -keystore mycert-pub.jks -file localhost.der + openssl x509 -outform der -in localhost.pem -out localhost.der + keytool -import -noprompt -trustcacerts -storepass storepass -alias localhost -keystore mycert-pub.jks -file localhost.der diff --git a/dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/DAO2.java b/dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/DAO2.java deleted file mode 100644 index dd55a1a..0000000 --- a/dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/DAO2.java +++ /dev/null @@ -1,20 +0,0 @@ -package fr.univtln.bruno.samples.jee91.dao; - -import jakarta.inject.Inject; -import jakarta.persistence.EntityManager; - -import java.util.List; - -public class DAO2 { - private EntityManager entityManager; - - @Inject - public DAO2(@H2Database EntityManager entityManager) { - this.entityManager = entityManager; - } - - public List<Person> findAll() { - return entityManager.createNamedQuery("Person.findAll").getResultList(); - } - -} diff --git a/dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/DAO1.java b/dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/MainDAO.java similarity index 95% rename from dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/DAO1.java rename to dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/MainDAO.java index 9b605d5..20d2e23 100644 --- a/dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/DAO1.java +++ b/dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/MainDAO.java @@ -7,7 +7,7 @@ import jakarta.persistence.PersistenceUnit; import java.util.Map; -public class DAO1 { +public class MainDAO { @PersistenceUnit(unitName="myappPU") EntityManagerFactory entityManagerFactory; diff --git a/dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/Person.java b/dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/Person.java deleted file mode 100644 index 33a2438..0000000 --- a/dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/Person.java +++ /dev/null @@ -1,14 +0,0 @@ -package fr.univtln.bruno.samples.jee91.dao; - -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.Id; - -@Entity -public class Person { - @Id - @GeneratedValue - long id; - - private String name; -} diff --git a/dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/PersonDAO.java b/dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/PersonDAO.java new file mode 100644 index 0000000..f05f5a5 --- /dev/null +++ b/dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/PersonDAO.java @@ -0,0 +1,31 @@ +package fr.univtln.bruno.samples.jee91.dao; + +import fr.univtln.bruno.samples.jee91.dao.entitymanagersproducers.H2Database; +import jakarta.inject.Inject; +import jakarta.persistence.EntityManager; + +import java.util.List; +import java.util.UUID; + +public class PersonDAO { + private EntityManager entityManager; + + @Inject + public PersonDAO(@H2Database EntityManager entityManager) { + this.entityManager = entityManager; + } + + public List<Person> findAll() { + return entityManager.createNamedQuery("Person.findAll").getResultList(); + } + + public UUID persist(Person person) { + entityManager.persist(person); + return person.getUuid(); + } + + public Person findByUUID(UUID uuid) { + return entityManager.createNamedQuery("Person.findByUUID", Person.class).setParameter("uuid",uuid).getSingleResult(); + } + +} diff --git a/dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/EntityManagerProducer.java b/dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/entitymanagersproducers/EntityManagerProducer.java similarity index 81% rename from dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/EntityManagerProducer.java rename to dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/entitymanagersproducers/EntityManagerProducer.java index e4cc76e..d6645fe 100644 --- a/dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/EntityManagerProducer.java +++ b/dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/entitymanagersproducers/EntityManagerProducer.java @@ -1,4 +1,4 @@ -package fr.univtln.bruno.samples.jee91.dao; +package fr.univtln.bruno.samples.jee91.dao.entitymanagersproducers; import jakarta.enterprise.inject.Produces; import jakarta.persistence.EntityManager; diff --git a/dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/H2Database.java b/dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/entitymanagersproducers/H2Database.java similarity index 84% rename from dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/H2Database.java rename to dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/entitymanagersproducers/H2Database.java index baef67c..698f607 100644 --- a/dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/H2Database.java +++ b/dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/entitymanagersproducers/H2Database.java @@ -1,4 +1,4 @@ -package fr.univtln.bruno.samples.jee91.dao; +package fr.univtln.bruno.samples.jee91.dao.entitymanagersproducers; import jakarta.inject.Qualifier; diff --git a/dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/PostgreSQLDatabase.java b/dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/entitymanagersproducers/PostgreSQLDatabase.java similarity index 84% rename from dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/PostgreSQLDatabase.java rename to dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/entitymanagersproducers/PostgreSQLDatabase.java index 81776b5..ce389e3 100644 --- a/dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/PostgreSQLDatabase.java +++ b/dao/src/main/java/fr/univtln/bruno/samples/jee91/dao/entitymanagersproducers/PostgreSQLDatabase.java @@ -1,4 +1,4 @@ -package fr.univtln.bruno.samples.jee91.dao; +package fr.univtln.bruno.samples.jee91.dao.entitymanagersproducers; import jakarta.inject.Qualifier; diff --git a/entites/pom.xml b/entites/pom.xml index 897e951..f21f6b1 100644 --- a/entites/pom.xml +++ b/entites/pom.xml @@ -15,6 +15,10 @@ <groupId>jakarta.platform</groupId> <artifactId>jakarta.jakartaee-api</artifactId> </dependency> + <dependency> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + </dependency> </dependencies> </project> \ No newline at end of file diff --git a/entites/src/main/java/fr/univtln/bruno/samples/jee91/dao/Person.java b/entites/src/main/java/fr/univtln/bruno/samples/jee91/dao/Person.java index c7cf306..2b85888 100644 --- a/entites/src/main/java/fr/univtln/bruno/samples/jee91/dao/Person.java +++ b/entites/src/main/java/fr/univtln/bruno/samples/jee91/dao/Person.java @@ -1,21 +1,41 @@ package fr.univtln.bruno.samples.jee91.dao; +import jakarta.json.bind.annotation.JsonbTransient; import jakarta.persistence.*; import jakarta.xml.bind.annotation.XmlRootElement; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.FieldDefaults; +import java.util.UUID; + +@Table(name = "PERSON") @Entity +@Getter +@Setter @NamedQueries({ @NamedQuery(name = "Person.findAll", query = "select p from Person p"), @NamedQuery( name = "Person.findAllOrderedByName", - query = "SELECT p FROM Person p ORDER BY p.name") + query = "SELECT p FROM Person p ORDER BY p.name"), + @NamedQuery( + name = "Person.findByUUID", + query = "SELECT p FROM Person p WHERE p.uuid=:uuid") }) @XmlRootElement +@FieldDefaults(level = AccessLevel.PRIVATE) public class Person { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "ID") + @JsonbTransient long id; - private String name; + @Column(name = "NAME") + String name; + + @Column(name = "UUID", updatable = false, nullable = false, unique = true) + UUID uuid = UUID.randomUUID(); } diff --git a/restApp/src/main/java/fr/univtln/bruno/samples/jee91/rs/SampleResource.java b/restApp/src/main/java/fr/univtln/bruno/samples/jee91/rs/SampleResource.java index 08647b5..d0feb96 100644 --- a/restApp/src/main/java/fr/univtln/bruno/samples/jee91/rs/SampleResource.java +++ b/restApp/src/main/java/fr/univtln/bruno/samples/jee91/rs/SampleResource.java @@ -1,23 +1,25 @@ package fr.univtln.bruno.samples.jee91.rs; -import fr.univtln.bruno.samples.jee91.dao.DAO1; -import fr.univtln.bruno.samples.jee91.dao.DAO2; +import fr.univtln.bruno.samples.jee91.dao.MainDAO; import fr.univtln.bruno.samples.jee91.dao.Person; +import fr.univtln.bruno.samples.jee91.dao.PersonDAO; import fr.univtln.bruno.samples.jee91.ejb.Hello; import fr.univtln.bruno.samples.jee91.ejb.qualifiers.SpokenLanguage; import jakarta.inject.Inject; -import jakarta.ws.rs.GET; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.Produces; +import jakarta.transaction.Transactional; +import jakarta.ws.rs.*; import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; import org.eclipse.microprofile.config.inject.ConfigProperty; import java.util.List; import java.util.Map; +import java.util.UUID; @Path("sample") +//@Stateless +@Produces({MediaType.APPLICATION_JSON,MediaType.TEXT_XML}) public class SampleResource { @Inject @@ -25,10 +27,10 @@ public class SampleResource { Hello hello; @Inject - DAO1 dao1; + MainDAO mainDAO; @Inject - DAO2 dao2; + PersonDAO personDAO; @Inject @ConfigProperty(name = "message") @@ -46,16 +48,29 @@ public class SampleResource { } @GET - @Path("dao1") - @Produces(MediaType.APPLICATION_JSON) - public Map<String, Object> dao1() { - return dao1.getMetadata(); + @Path("main") + public Map<String, Object> mainGetMetadata() { + return mainDAO.getMetadata(); } @GET - @Path("dao2") - @Produces(MediaType.APPLICATION_JSON) - public List<Person> dao2() { - return dao2.findAll(); + @Path("persons") + public List<Person> personsFindAll() { + return personDAO.findAll(); } + + @GET + @Path("persons/{uuid}") + public Person personsFind(@PathParam("uuid") UUID uuid) { + return personDAO.findByUUID(uuid); + } + + @Transactional + @POST + @Path("persons") + @Consumes(MediaType.APPLICATION_JSON) + public UUID personsPersist(Person person) { + return personDAO.persist(person); + } + } diff --git a/restApp/src/main/resources/insert.sql b/restApp/src/main/resources/insert.sql index 4f6d3cd..e74e7ff 100644 --- a/restApp/src/main/resources/insert.sql +++ b/restApp/src/main/resources/insert.sql @@ -1,4 +1,4 @@ -INSERT INTO "public"."person" ("name") VALUES ('pierre'); -INSERT INTO "public"."person" ("name") VALUES ('Marie'); -INSERT INTO "public"."person" ("name") VALUES ('jacques'); -INSERT INTO "public"."person" ("name") VALUES ('Annie'); \ No newline at end of file +INSERT INTO "public"."person" ("name", "uuid") VALUES ('Yves', 'ACED00057372000E6A6176612E7574696C2E55554944BC9903F7986D852F0200024A000C6C65617374536967426974734A000B6D6F7374536967426974737870B25A000916801FE374FCFAC5DCF94C11'); +INSERT INTO "public"."person" ("name", "uuid") VALUES ('Pierre', 'ACED00057372000E6A6176612E7574696C2E55554944BC9903F7986D852F0200024A000C6C65617374536967426974734A000B6D6F7374536967426974737870B8F28F7D3945291756DAC7325DF44938'); +INSERT INTO "public"."person" ("name", "uuid") VALUES ('Marie', 'ACED00057372000E6A6176612E7574696C2E55554944BC9903F7986D852F0200024A000C6C65617374536967426974734A000B6D6F73745369674269747378709AA3211A9B897403843C82366C6B450E'); +INSERT INTO "public"."person" ("name", "uuid") VALUES ('Jeanne', 'ACED00057372000E6A6176612E7574696C2E55554944BC9903F7986D852F0200024A000C6C65617374536967426974734A000B6D6F7374536967426974737870BC1580AEB48C0F0C0B3C82E884AA4C3C'); \ No newline at end of file diff --git a/wsApp/src/main/java/fr/univtln/bruno/samples/jee91/ws/WSServer.java b/wsApp/src/main/java/fr/univtln/bruno/samples/jee91/ws/WSServer.java index ae8b211..eacbdf6 100644 --- a/wsApp/src/main/java/fr/univtln/bruno/samples/jee91/ws/WSServer.java +++ b/wsApp/src/main/java/fr/univtln/bruno/samples/jee91/ws/WSServer.java @@ -1,6 +1,6 @@ package fr.univtln.bruno.samples.jee91.ws; -import fr.univtln.bruno.samples.jee91.dao.DAO1; +import fr.univtln.bruno.samples.jee91.dao.MainDAO; import fr.univtln.bruno.samples.jee91.ejb.Hello; import fr.univtln.bruno.samples.jee91.ejb.qualifiers.SpokenLanguage; import jakarta.enterprise.context.ApplicationScoped; @@ -25,7 +25,7 @@ public class WSServer { Hello hello; @Inject - DAO1 dao1; + MainDAO dao1; @OnOpen public void onOpen(Session session) throws EncodeException, IOException { diff --git a/wsApp/src/main/webapp/WEB-INF/beans.xml b/wsApp/src/main/webapp/WEB-INF/beans.xml deleted file mode 100644 index f8e2542..0000000 --- a/wsApp/src/main/webapp/WEB-INF/beans.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd" - bean-discovery-mode="all"> -</beans> \ No newline at end of file -- GitLab