Ceci est une ancienne révision du document !
D35 - TP3 - EJB et REST
L’objectif de cette séance est de mettre en place simplement des EJB 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 JEE glassfish.
Manuellement
Avec docker
Il est aussi possible d’utiliser docker pour cela. https://github.com/emmanuelbruno/dockerpayaracompose (qui s’appuie sur https://github.com/payara/docker-payaraserver-full)
Installer glasfish et la base de donnée (postgres) :
git clone git@github.com:dptinfoutln/dockerpayaracompose.git docker-compose up -d payara-full docker-compose logs -f
Paramétrer les connexions à la base de données :
docker-compose exec payara-full /opt/payara41/bin/asadmin \ --user admin \ --passwordfile=/opt/pwdfile \ create-jdbc-connection-pool \ --datasourceclassname org.postgresql.ds.PGConnectionPoolDataSource \ --restype javax.sql.ConnectionPoolDataSource \ --property portNumber=5432:password=glassfishdbpassword:user=glassfish:serverName=db:databaseName=glassfish \ postgres-pool
docker-compose exec payara-full /opt/payara41/bin/asadmin \ --user admin \ --passwordfile=/opt/pwdfile \ create-jdbc-resource \ --connectionpoolid postgres-pool \ jdbc/postgres-pool
Déployer une application :
cp /tmp/ejb/target/ejb-1.0-SNAPSHOT.jar data/payara
Avec docker machine (en cours de rédaction): Nécessite uniquement virtualbox, docker-compose et éventuellement un client docker.
RESTE UN PB de doit avec dockjer machine : enlever le montage du volume pour postgresql dans compose.
alias CMD_DM="docker-machine --storage-path /usr/local/vbox/travail/$USER" alias CMD_DM_C="docker-machine create --driver virtualbox --engine-env http_proxy --engine-env https_proxy" CMD_DM_C testMachine CMD_DM ip testMachine if [[ ! -d "~/MY_DOCKER_DATA" ]]; then mkdir ~/MY_DOCKER_DATA; fi docker-machine stop testMachine VBoxManage sharedfolder add testMachine --name dockerhome --hostpath `echo ${HOME}`/MY_DOCKER_DATA docker-machine start testMachine eval "$(docker-machine env --no-proxy testMachine)" CMD_DM -D ssh testMachine "sudo umount /home/docker/HOME ; rm -rf HOME ; mkdir HOME" CMD_DM ssh testMachine sudo mount -o uid=`id -u`,gid=`id -g` -t vboxsf dockerhome HOME cd ~/MY_DOCKER_DATA git clone git@github.com:dptinfoutln/dockerpayaracompose.git CMD_DM ssh testMachine sudo sh -c "wget https://github.com/docker/compose/releases/download/1.8.1/docker-compose-$(uname -s)-$(uname -m) -O /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose" cd HOME/dockerpayaracompose/ docker-compose up -d exit CMD_DM ip testMachine ouvrir le port 4848 dans un navigateur
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 :
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
Il faut ensuite le compiler, en faire un package (war) et le déployer sur un serveur JEE.
/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
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
Hello EJBs
En utilisant l’archetype Maven suivant, nous allons mettre en place un “Hello word REST à base d’EJB.”
mvn archetype:generate \ -DarchetypeGroupId=org.codehaus.mojo.archetypes \ -DarchetypeArtifactId=ejb-javaee7 \ -DarchetypeVersion=1.1 \ -DgroupId=fr.univtln.bruno.test \ -DartifactId=ejb \ -Dversion=1.0-SNAPSHOT
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 petit exemple simple :
git clone https://bruno@lsis.univ-tln.fr/redmine/bruno/samples/rest-ejb-jee.git mvn package && asadmin deploy --name ejbws ejbws/target/ejbws-1.0-SNAPSHOT.war curl http://localhost:8080/ejbws-1.0-SNAPSHOT/webresources/auteur curl http://localhost:8080/ejbws-1.0-SNAPSHOT/webresources/auteur/2 curl -X PUT -H "Accept: application/json" -H "Content-Type: application/json" -d '{"nom" : "Henry", "prenom": "Marc"}' 'http://localhost:8080/ejbws-1.0-SNAPSHOT/webresources/auteur'
—- dataentry page —- type : TP enseignement_tags : D35 technologie_tags : Java, JavaEE, EJB, RestWS theme_tags : Composants