Skip to main content

Enterprise Java Beans

Les EJB pour Enterprise Java Beans sont un standard de la pateforme JavaEE pour créer des composants serveur.

Création du projet EJB

Pour créer le projet serveur, lancez IntelliJ IDEA et créer un nouveau projet en utilisant le template Java Entreprise.

Capture-d’écran-2020-10-31-125540.png

Dans le choix des dépendances, cochez ensuite Enterprise Java Beans (EJB) ainsi que Servlet :

Capture-d’écran-2020-10-31-125749.png

Terminez ensuite la création de votre projet en renseignant et un nom et un GroupId.

Les EJBs

Il existe plusieurs types d'EJB.

Entity

Les EJB Entity permettent de représenter les données manipulées par l'application. On en parlera plus en détail dans le chapitre suivant.

Message

Les EJB Message Driven servent à accomplir des tâches de manière asyncrhone.

Session

Les EJB session permettent de proposer des services avec ou sans état. Il pour être injectés par le conteneur EJB à un service local (comme une servlee par exemple), mais il peut aussi être appelé par un client distant, via le protocole RMI.

EJB Session

Interface

Pour définir un EJB session, il faut définir une interface qui définir les méthodes accessibles par le code client. Il faut y ajouter une interface pour signaler au conteneur EJB qu'il s'agit d'une interface d'EJB ; @Remote pour un accès par un client distant, et @Local pour un accès par un composant local.

@Remote
public interface GestionContactRemote {
    public String coucouContact(String nomContact);
}
@Local
public interface GestionContactLocal {
    public String coucouContact(String nomContact);
}

Implémentation

On peut ensuite créer une classe EJB qui implémente cette interface. On doit utiliser une annotation pour signaler au conteneur qu'il s'agit d'une classe d'implémentation EJB. On utilise @Stateless pour un composant qui sera instancié à chaque demande. Le paramètre d'annotation mappedName permet de préciser un nom dans l'annuaire JNDI qui va référencer tous les EJB.

@Stateless(mappedName="ContactBean")
public class GestionContactBean implements GestionContactRemote {
    public String coucouContact(String nomContact) {
        return "Coucou, "+nomContact;
    }
}

Pour avoir toujours la même instance du composant fournie par le conteneur pour une session de client donnée, on peut utiliser à la place @Stateful.

@Stateful(mappedName="ContactBean")
public class GestionContactBean implements GestionContactRemote {
    public String coucouContact(String nomContact) {
        return "Coucou, "+nomContact;
    }
}

Utilisation

Pour demander au conteneur d'EJB d'inject un EJB dans un autre composant, comme un autre EJB, ou une Servlet par exemple, utilisez l'annotation @EJB sur un attribut du type d'une interface EJB locale :

@EJB
private GestionContactLocal gestionContact;

Client RMI

On peut accèder aux EJB remote via la protocole RMI depuis un client distant Java. Après avoir lancé le serveur Wildfly qui possède des EJB Remote, on peut regarder ensuite les logs du serveur Wildfly dans l'interface d'IntelliJ IDEA, et y voir une ligne affirmant que l'EJB a bien été detecté et ajouté à l'annuaire JNDI. Copiez l'URL qui commence par EJB et gardez là dans un bloc note, elle sera utile plus tard.

Capture-d’écran-2020-10-31-135413.png

Configuration du projet Client RMI

Pour le client EJB, créez un nouveau projet IntelliJ, cette fois en utilisant le template Maven et en utilisant l'archétype Quickstart. Une fois votre projet généré, rajoutez la dépendance suivante dans votre fichier pom.xml :

<dependency>
  <groupId>org.wildfly</groupId>
  <artifactId>wildfly-ejb-client-bom</artifactId>
  <version>21.0.0.Final</version>
  <type>pom</type>
</dependency>

Mettez à jours vos dépendances Maven, puis ajoutez une Run Config d'application Java normale.

Récupérer les EJB

Dans un premier temps, il faut créer un package sessionBean directement dans le dossier de sources java. Dans ce package, copiez votre interface GestionContactRemote et retirez lui l'annotation @Remote.

Dans la méthode Main ajoutez d'abord le code suivant, afin de configurer la connexion EJB :

final Hashtable<String, String> jndiProperties = new Hashtable<>();
jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.wildfly.naming.client.WildFlyInitialContextFactory");
if(Boolean.getBoolean("http")) {
  jndiProperties.put(Context.PROVIDER_URL,"http://localhost:8080/wildfly-services");
} else {
  jndiProperties.put(Context.PROVIDER_URL,"remote+http://localhost:8080");
}
final Context context = new InitialContext(jndiProperties);

Ensuite pour récupérer votre EJB, ajouter ce code, en modifiant la string passée à la méthode lookup() par l'URL ejb que nous avons noté tout à l'heure :

final GestionContactRemote ejb = (GestionContactRemote) context.lookup("ejb:/efrei-m1-jakartaee-tp4-ejb-1.0-SNAPSHOT/GestionContactBean!sessionBeans.GestionContactRemote");

Vous pouvez enfin tester votre EJB :

System.out.println(ejb.coucouContact("test"));

Si tout s'est bien passé, vous devriez observer les logs du client EJB dans votre console ainsi que votre afichage :

Capture-d’écran-2020-10-31-140516.png