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.

Dans ce cadre de ces TP nous utiliserons le serveur d’applications JEE glassfish.

Mettez en place votre propre serveur glassfish en suivant http://bruno.lsis.univ-tln.fr/java/glassfish ou directement avec docker (cf. ci dessous). Pour installer Docker dans un VM suivez https://bruno.lsis.univ-tln.fr/docker/dockerinvm

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 glassfish et la base de donnée (postgres) :

  git clone git@github.com:dptinfoutln/dockerpayaracompose.git
  cd dockerpayaracompose
  docker-compose up -d payara-full 
  docker-compose  logs -f 

L’interface du serveur est accessible sur https://localhost:4848/

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 (après compilation ci dessous), soit par l’interface web soit si les volumes docker sont utilisables, soit

cp /tmp/ejb/target/ejb-1.0-SNAPSHOT.jar data/payara 

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
Etudier en détail cet exemple avant de passer à la suite.

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
Ajouter à la classe NewSessionBean une variable message de type String (“Hello World from EJB !”) et son accesseur.
Annoter l’EJB 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.
La plupart des librairie sont déjà présente dans le serveur d’application, il faut donc faire attention au scope maven des dépendances.

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

Glassfish est fourni et préparamétré pour une base de donnée relationnelle appelée Derby. Elle se lance avec la commande 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

Mettez en place (par deux) une API REST avec JEE pour gérer un programme gestion de données. Vous pourrez le faire sur votre TP de révision ou directement sur le (mini projet qui servira d'évaluation pratique). Best Practices for Designing a Pragmatic RESTful API de Vinay Sahni.

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