Exercice 2 - Création du projet client (lourd)⚓︎
Nous allons maintenant implémenter la brique "Appli Java" du schéma suivant :
1. Complétion du projet EJB⚓︎
Complétion du projet EJB
Nous l'avons vu dans le cours, un EJB est en fait un triplet :
- Une interface local, pour les appels de l'EJB depuis la même JVM, ce que nous avons toujours fait pour l'instant.
- Une interface remote, pour les apples distants, depuis une autre JVM donc.
- Une classe implémentant ces deux interfaces.
Il y a donc deux modifications à effectuer dans notre projet EJB :
-
La création de l'interface remote, au même niveau que l'interface local, et qui a exactement le même contenu :
☕ Code Java - Interface NoteBusinessRemote@Remote public interface NoteBusinessRemote { public List<ResultBean> getResultsList(); public void insertNote(NoteBean note); public void insertStudent(StudentBean studentBean); public void updateResult(ResultBean result); public Float computeMean(List<ResultBean> notesList); }
Attention à ne pas oublier l'annotation
@Remote
!Meilleure pratique
Comme le contenu des deux interfaces est exactement le même, il serait préférable de créer une interface contenant les signatures, et de faire hériter les deux interfaces locale et distante.
-
Dans la classe
NoteBusinessImpl
, ajouter l'implémentation de cette nouvelle interface :☕ Code Java - Classe NoteBusinessImplpublic class NoteBusinessImpl implements NoteBusiness, NoteBusinessRemote {
2. Création du projet Java⚓︎
Création du projet java
-
Créer un projet Maven avec l'archetype
maven-archetype-quickstart
, avecgestionnotesclient
comme nom (et donc commeartefactId
). -
Dans le 📄
pom.xml
, ajouter la dépendance vers le projet EJB (à nouveau, il suffit en fait d'avoir les beans et l'interface remote que nous venons de créer) :pom.xml - Projet gestionnotesclient<dependency> <groupId>fr.univtours.polytech</groupId> <artifactId>gestionnotesejb</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
-
Toujours dans ce même 📄
pom.xml
, ajouter la dépendance vers la bibliothèque permettant d'appeler des EJBs sur un serveur WildFly :pom.xml - Projet gestionnotesclient<dependency> <groupId>org.wildfly</groupId> <artifactId>wildfly-ejb-client-bom</artifactId> <version>31.0.1.Final</version> <type>pom</type> </dependency>
Version
Pensez à vérifier qu'il s'agit bien de la dernière version. Il suffit de chercher cette bibliothèque dans le référentiel Maven.
-
Ce projet va uniquement contenir une seule classe, la classe
App.java
créée par défaut, qui contient une méthodemain
.Il va falloir appeler l'EJB. Mais ici, nous ne sommes pas dans le même projet, nous ne pouvons donc pas utiliser l'injection de dépendances ...
Il faut donc appeler l'EJB à la main, c'est-à-dire en faisant un
lookup
à partir de son nom JNDI.On trouve ce nom JNDI en cherchant la chaîne de caractères commençant par
ejb:
dans les logs du serveur WildFLy. Il y a un seule EJB, donc il doit y avoir une seule ligne correspondant, qui doit ressembler à ceci :📋 Console WildFlyejb:gestionnotesear/gestionnotesweb-1.0-SNAPSHOT/NoteBusinessImpl!fr.univtours.polytech.gestionnotesejb.business.NoteBusinessRemote
-
Dans cette classe
App.java
, créer la méthodegetNoteBusiness
qui va renvoyer l'EJB (concrètement, elle renvoie l'interface remote) :☕ Code Java/** * * @return L'EJB session pour manipulation. * @throws NamingException Si l'EJB n'est pas trouvé dans l'annuaire JNDI. */ private static NoteBusinessRemote getNoteBusiness() throws NamingException { Properties jndiProperties = new Properties(); jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.wildfly.naming.client.WildFlyInitialContextFactory"); jndiProperties.put(Context.PROVIDER_URL, "remote+http://localhost:8080"); Context ctx = new InitialContext(jndiProperties); String url = "ejb:gestionnotesear/gestionnotesweb-1.0-SNAPSHOT/NoteBusinessImpl!fr.univtours.polytech.gestionnotesejb.business.NoteBusinessRemote"; System.out.println("URL : " + url); NoteBusinessRemote business = (NoteBusinessRemote) ctx.lookup(url); return business; }
-
Enfin, dans la méthode
main
, nous allons appeler cette méthode et insérer deux étudiants en BDD :☕ Code Javapublic static void main(String[] args) throws NamingException { // Cette objet business va nous permettre d'appeler les services métiers // disponibles, // c'est-à-dire ceux définis dans l'interface distante : NoteBusinessRemote. NoteBusinessRemote noteBusiness = getNoteBusiness(); StudentBean studentA = new StudentBean(); studentA.setFirstName("Alice"); studentA.setName("A"); StudentBean studentB = new StudentBean(); studentB.setFirstName("Bob"); studentB.setName("B"); noteBusiness.insertStudent(studentA); noteBusiness.insertStudent(studentB); }
-
-
Il ne reste plus qu'à exécuter la méthode
main
de ce projet (c'est un projet Java classique, pas un projet JEE), et de vérifier que les étudiants Alice A et Bob B ont bien été ajoutés en BDD !
ClassNotFoundException
Si tu obtiens l'erreur suivante :
java.lang.ClassNotFoundException: org.wildfly.naming.client.WildFlyInitialContextFactory
c'est que tu n'as pas bien ajouté la dépendance vers la bibliothèque wildfly-ejb-client-bom
.