Aller au contenu

Exercice 2 - Implémentation d'un client (lourd) Java⚓︎

Nous allons maintenant implémenter la brique "Appli Java" du schéma suivant :

archi appli

Architecture de notre application

1. Création du projet Java⚓︎

Nous allons pour cela créer un projet Java indépendant, qui va appeler cet EJB, et plus précisément l'interface remote.

Depuis la vue Enterprise Explorer, créer un nouveau Projet Java (sélectionner Java Project) nommé GestionNotesClient, sélectionner la bonne JDK, décocher la case "Create module-info.java file", et enfin cliquer sur Finish.

Nous allons avoir besoin du modèle (c'est-à-dire des beans), ainsi que de l'interface remote. Pour cela, nous allons ajouter le projet GestionNotesEJB dans le classpath du projet GestionNotesClient. Nous verrons dans une prochaine version comment faire pour ne pas avoir à importer tout le projet EJB :

Classpath projet GestionNotesClient

Gesiton du classpath du client Java

Dans ce projet, créer la classe fr.univtours.polytech.gestionnotes.client.NoteClient, en cochant la case pour avoir la méthode main. Cette classe va contenir une méthode getBusiness permettant de manipuler l'EJB session, via son nom JNDI. La méthode main va appeler cette méthode, et effectuer quelques opérations pour tester le bon fonctionnement de l'EJB.

Pour accéder à l'annuaire JNDI à distance, il faut créer un object Context paramétré comme indiqué ci-dessous. On utilise ensuite sur cet objet la méthode lookup(url) qui permet d'accéder à l'objet à distance (depuis une autre JVM, éventuellement sur un autre serveur) uniquement en connaissant son nom JNDI (c'est ce qui est contenu dans la variable url).

☕ Code Java - NoteClient - La méthode getBusiness()
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
    * 
    * @return L'EJB session pour manipulation.
    * @throws NamingException Si l'EJB n'est pas trouvé dans l'annuaire JNDI.
    */
private static NotesBusinessRemote getBusiness() 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");//(1)!
    Context ctx = new InitialContext(jndiProperties);

    String appName = "";
    String projectName = "GestionNotesEJB";
    String className = "NotesBusinessImpl";
    String remote = NotesBusinessRemote.class.getName();

    String url = "ejb:" + appName + "/" + projectName + "/" + className + "!" + remote;//(2)

    NotesBusinessRemote business = (NotesBusinessRemote) ctx.lookup(url);

    return business;
}
  1. Attention à adapter le port ici si vous l'avez modifié.
  2. Cette URL doit exactement correspondre à celle apparaissant dans les logs du Serveur WildFly.
☕ Code Java - NoteClient - La méthode main()
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public 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 : NotesBusinessRemote.
    NotesBusinessRemote business = getBusiness();

    // 1er étudiant :
    NoteBean bean1 = new NoteBean();
    bean1.setName("Haddock");
    bean1.setFirstName("Capitaine");
    bean1.setNote(10.5D);
    // Appel du service métier d'ajout d'une note :
    business.insertNote(bean1);

    // 2ème étudiant :
    NoteBean bean2 = new NoteBean();
    bean2.setName("Tournesol");
    bean2.setFirstName("Professeur");
    bean2.setNote(20D);
    // Appel du service métier d'ajout d'une note :
    business.insertNote(bean2);

    // On affiche la liste des notes présentes en BDD.
    // Appel du service métier de récupération de toutes les notes :
    List<NoteBean> notesList = business.getNotesList();
    System.out.println("--- Notes ---");
    for (NoteBean bean : notesList) {
        System.out.println(bean.getFirstName() + " " + bean.getName() + " : " + bean.getNote());
    }
    System.out.println("La moyenne est de " + business.computeMean(notesList));
}

2. Test de l'EJB session avec le projet client⚓︎

Pour tester ce client, il suffit de faire un clic droit sur la classe NoteClient, et de :material-mouse:Run As > Java Application. En faisant cela, on obtient l'erreur suivante :

📋 Logs du projet ClientJava (main de la classe Client)
java.lang.ClassNotFoundException: org.wildfly.naming.client.WildFlyInitialContextFactory

En effet, si on utilise comme client de l'EJB une projet Java classique, il faut importer un JAR fourni par WildFly. Dans le classpath du projet ClientJava, il faut ajouter le JAR présent ici : 📄<WILDFLY_HOME>/bin/client/jboss-client.jar (il faut cliquer sur Add External JARs...).

Lorsqu'on relance le test, on obtient le résultat suivant :

📋 Logs du projet ClientJava (main de la classe Client)
--- Notes ---
Capitaine Haddock : 10.5
Professeur Tournesol : 20.0
La moyenne est de 15.25

On peut également vérifier que les deux notes ont bien été ajoutées dans la table en BDD.

Warning

Attention, à chaque fois qu'on relance le client Java, les notes du Capitaine Haddock et du Professeur Tournesol sont ajoutées dans la liste des notes.

En revanche, si vous avez laissé la configuration "drop and create" dans le 📄persistence.xml, à chaque redémarrage du serveur, ou à chaque fois que l'application est redéployée, la table est vidée.