Ceci est une ancienne révision du document !
I311 - EJB, CDI et REST
L’objectif de cette séance est de mettre en place simplement des EJB, des beans CDI en lien avec les services web REST et la persistance JPA.
Mise en place de l'environnement de travail
Dans ce cadre de ces TP nous utiliserons le serveur d’applications JakartaEE glassfish et plus plus précisément la distribution Payara (https://www.payara.fish/). Des images docker sont disponibles pour différents profils et différents JDK (https://hub.docker.com/u/payara/). Dans un premier temps nous utiliserons la version complète (https://hub.docker.com/r/payara/server-full).
Avec docker
Il est aussi possible d’utiliser docker pour cela. https://github.com/dptinfoutln/dockerpayaracompose/tree/develop (qui s’appuie sur https://github.com/payara/docker-payaraserver-full)
L’interface du serveur est accessible sur https://localhost:4848/ ou celle de votre VM virtualbox.
Pour paramétrer les connexions à la base de données, étudier le docker-compose.yml qui contient un exemple avec H2 (à adapter pour postgres).
Pour déployer une application, il est possible de le faire depuis l’interface web d’administration, via un volume docker, ou en faisant un image contenant l’application. Votre IDE peut etre paramétré pour faire cela via l’API spécifique du serveur (https://docs.payara.fish/community/docs/documentation/ecosystem/intellij-plugin/README.html).
===== Services Web REST =====
Pour des rappels sur REST vous pourrez lire ou relire une introduction à Rest et Jersey et tp de d24 sur Rest.
Les EJB peuvent être utilisés très simplement dans des services web, il suffit de les annoter comme des ressources.
L’archetype suivant présente un exemple :
<konsole>
mvn archetype:generate \
-DarchetypeGroupId=com.sun.jersey.archetypes \
-DarchetypeArtifactId=jersey-quickstart-ejb \
-DarchetypeVersion=1.19 \
-DgroupId=fr.univtln.bruno.test \
-DartifactId=ejbws \
-Dversion=1.0-SNAPSHOT
mvn package
</konsole>
Il faut ensuite le compiler, en faire un package (war) et le déployer sur un serveur JEE.
<konsole>
/t/ejbws$ asadmin start-domain domain1
Picked up _JAVA_OPTIONS: -Djava.net.preferIPv4Stack=true
Waiting for domain1 to start ..........
Successfully started the domain : domain1
domain Location: /home/bruno/glassfish4/glassfish/domains/domain1
Log File: /home/bruno/glassfish4/glassfish/domains/domain1/logs/server.log
Admin Port: 4848
Command start-domain executed successfully.
/t/ejbws$ asadmin deploy target/ejbws.war
</konsole>
Le serveur web associé est accessible ici (cf.
src/main/webapp/index.jsp
, les jsp seront abordées plus tard) :
http://localhost:8080/ejbws/
Ainsi que les service web associés au resources :
curl http://localhost:8080/ejbws/webresources/myresource
<note>
Etudier en détail cet exemple avant de passer à la suite.
</note>
Utiliser l’application de départ proposée ici : https://www.eclipse.org/community/eclipse_newsletter/2019/november/1.php
en résumé
déployer le .war qui se trouve dans le /target dans payara
accéder à la resource
Hello EJBs
En utilisant l’archetype Maven suivant, nous allons mettre en place un “Hello word REST à base d’EJB.”
NewSessionBean
une variable message de type String (“Hello World from EJB !”) et son accesseur.
NewSessionBean
pour en faire une ressource Web Service Rest (puis mvn install
). Ajouter le projet EJB comme une dépendance du service web précédent ce qui ajoutera les ejb au fichier war final. Redéployer le projet et tester les services.
JPA dans JavaEE
Pour utiliser JPA avec un serveur JEE, le persistence.xml
doit être adapté :
<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd" version="2.1"> <persistence-unit name="authors" transaction-type="JTA"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <jta-data-source>jdbc/h2-pool</jta-data-source> //classes.. </persistence-unit> </persistence>
Ensuite l’entity manager est injecté avec @PersistenceContext
ou en précisant éventuellement l’unité de persistance@PersistenceContext(unitName = “….”)
. Cf. https://docs.oracle.com/javaee/7/tutorial/persistence-intro003.htm#BNBQW
asadmin start-database
.
Vous trouverez plus de détails sur les EJB dans le tutoriel JEE : https://docs.oracle.com/javaee/7/tutorial/partentbeans.htm#BNBLR
Voilà un exemple https://github.com/emmanuelbruno/simplejee/tree/development