IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Création d'un premier EJB avec Eclipse et JOnAS


précédentsommairesuivant

III. Développement de l'application▲

III-A. Création du projet▲

La configuration étant à présent terminée, nous allons pouvoir rentrer dans le vif du sujet, c'est-à-dire le développement de notre premier EJB.

La première chose à faire est de créer un nouveau projet.
Pour ce faire, nous devons aller dans le menu « File --> New --> Project ».

Image non disponible
  • Choisissez « Jonas Project ».
  • Cliquez sur « next ».
  • Choisissez le nom du projet : par exemple FirstEJB.
  • Cliquez sur « next ».
  • Cochez la case « Create a web application ».
  • Cliquez sur « Finish ».

Voici normalement à quoi ressemblera l'arborescence de votre projet.

Image non disponible

III-B. Création de l'EJB▲

Nous allons créer notre premier EJB à l'aide du plugin Jope.

  • Allez dans le menu « File --> New --> Jonas EJB »
Image non disponible
  • Entrez le nom du package. Par exemple « helloWorld ».
  • Entrez le nom de l'EJB. Par exemple « HelloWorld ».
  • Entrez le nom de l'archive. Par exemple « helloWorld ».
  • Cochez la case « Remote ».
Image non disponible

Vous remarquerez que les différentes classes nécessaires ainsi que le client ont été créés.

Image non disponible

III-C. Code généré▲

Je vais vous présenter le code généré par le plugin.

Premièrement voici l'interface distante.
Cette interface va contenir toutes les méthodes métier qu'un client peut invoquer sur notre EJB

HelloWorld.java
Sélectionnez
// HelloWorld.java
package helloWorld;

import java.rmi.RemoteException;
import javax.ejb.EJBObject;

/**
 * HelloWorld remote interface
 */
public interface HelloWorld extends EJBObject {
    public void method1() throws RemoteException;
    public void method2(java.lang.String s) throws RemoteException;

}

L'interface d'accueil.
Cette interface définit les méthodes qu'un client peut invoquer pour :

  • créer des objets EJB ;
  • trouver les objets EJB existants (pour les beans entité) ;
  • supprimer les objets EJB.
HelloWorldHome.java
Sélectionnez
// HelloWorldHome.java

package helloWorld;

import java.rmi.RemoteException;
import java.util.Collection;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;
import javax.ejb.FinderException;

/**
 * Home interface for the bean HelloWorld
 */
public interface HelloWorldHome extends EJBHome {
    HelloWorld create() throws CreateException, RemoteException;
}

L'EJB qui va contenir toutes les méthodes métier de notre application.

HelloWorldEJB.java
Sélectionnez
// HelloWorldEJB.java
// Stateless Session bean

package helloWorld;

import java.rmi.RemoteException;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import javax.ejb.CreateException;
import javax.ejb.EJBException;
import javax.ejb.RemoveException;
import javax.ejb.EJBObject;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;


/**
 *
 */
public class HelloWorldEJB implements SessionBean {

    SessionContext ejbContext;

    // ------------------------------------------------------------------
    // SessionBean implementation
    // ------------------------------------------------------------------

    public void setSessionContext(SessionContext ctx) {
        ejbContext = ctx;
    }

    public void ejbRemove() {
    }

    public void ejbCreate() throws CreateException {
    }

    public void ejbPassivate() {
    }

    public void ejbActivate() {
    }
    
    // ------------------------------------------------------------------
    // HelloWorld implementation
    // ------------------------------------------------------------------

    /**
     * method1
     */
    public void method1() {
    }

    /**
     * method2
     */
    public void method2(java.lang.String s) {
    }
}

Le client de l'EJB.

HelloWorldClient.java
Sélectionnez
// HelloWorldClient.java
// mini Client for accessing bean HelloWorld

package helloWorld;

import java.rmi.RemoteException;
import java.util.Collection;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;

/**
 *
 */
public class HelloWorldClient {

    static Context ctx = null; 
    static HelloWorldHome home = null;

    public static void main(String[] arg) {

    // Get InitialContext
    try {
        ctx = getInitialContext();
    } catch (NamingException e) {
        e.printStackTrace();
        System.exit(2);
    }

    // Lookup bean home 
    String bName = "HelloWorldHome";
    try {
        home = (HelloWorldHome) PortableRemoteObject.narrow(ctx.lookup(bName), HelloWorldHome.class);
        HelloWorld bean = home.create();
            bean.method1();
    } catch(Exception e) {
        e.printStackTrace();
        System.exit(2);
    }

    // ...
    }
    
        /**
     * Using a Properties object will work on JDK 1.1.x and Java2
     * clients
     */
    static private Context getInitialContext() throws NamingException {
      String url = "rmi://localhost:1099";
      
      try {
        // Get an InitialContext
        Properties h = new Properties();
        h.put(Context.INITIAL_CONTEXT_FACTORY,
          "com.sun.jndi.rmi.registry.RegistryContextFactory");
        h.put(Context.PROVIDER_URL, url);
        return new InitialContext(h);
      } catch (NamingException ne) {
          ne.printStackTrace();
        throw ne;
      }
    }
    
}

Le descripteur de déploiement qui va reprendre les conditions que doivent remplir les composants telles que :

  • la gestion du cycle de vie des beans ;
  • la persistance ;
  • le paramétrage des transactions ;
  • …
helloWorld.xml
Sélectionnez
<!DOCTYPE ejb-jar PUBLIC
          "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN"
          "http://java.sun.com/dtd/ejb-jar_2_0.dtd">

<ejb-jar>

  <description>Describe here the content of this file</description>
  <display-name>helloWorld</display-name>

  <enterprise-beans>
    <session>
      <description>Describe here the session bean HelloWorld</description>
      <display-name>helloWorld/HelloWorldEJB</display-name>
      <ejb-name>HelloWorldEJB</ejb-name>
      <home>helloWorld.HelloWorldHome</home>
      <remote>helloWorld.HelloWorld</remote>
      <ejb-class>helloWorld.HelloWorldEJB</ejb-class>
      <session-type>Stateless</session-type>
      <transaction-type>Container</transaction-type>
      <env-entry>
    <env-entry-name>name1</env-entry-name>
    <env-entry-type>java.lang.String</env-entry-type>
    <env-entry-value>value1</env-entry-value>
      </env-entry>
      <resource-ref>
    <res-ref-name>jdbc/mydb</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Application</res-auth>
      </resource-ref>
    </session>
  </enterprise-beans>

  <assembly-descriptor>

    <container-transaction>
      <method>
    <ejb-name>HelloWorldEJB</ejb-name>
    <method-name>*</method-name>
      </method>
      <trans-attribute>Supports</trans-attribute>
    </container-transaction>

  </assembly-descriptor>

</ejb-jar>

Le fichier propre à chaque conteneur d'EJB qui est un fichier xml reprenant des fonctions qui ne sont pas traitées par la spécification EJB.

jonas-helloWorld.xml
Sélectionnez
<!DOCTYPE jonas-ejb-jar PUBLIC
          "-//ObjectWeb//DTD JOnAS 3.2//EN"
          "http://www.objectweb.org/jonas/dtds/jonas-ejb-jar_3_2.dtd">

<jonas-ejb-jar>

  <jonas-session>
    <ejb-name>HelloWorldEJB</ejb-name>
    <jndi-name>HelloWorldHome</jndi-name>
    <jonas-resource>
      <res-ref-name>jdbc/mydb</res-ref-name>
      <jndi-name>jdbc_1</jndi-name>
    </jonas-resource>
  </jonas-session>

</jonas-ejb-jar>

III-D. Modification du code▲

Nous allons à présent modifier les différentes classes pour que notre client puisse afficher « Hello World » dans la console d'Eclipse.
Commençons par modifier l'EJB, en lui ajoutant une méthode qui va retourner un String. Remplacez les deux méthodes actuelles.

 
Sélectionnez
/**
     * method1
     */
    public void method1() {
    }

    /**
     * method2
     */
    public void method2(java.lang.String s) {
    }

par cette méthode

 
Sélectionnez
public String hello()
    {
        return "Hello World";
    }

Nous allons également modifier l'interface distante pour que le client puisse appeler la méthode hello(). Remplacez les deux lignes actuelles

 
Sélectionnez
public void method1() throws RemoteException;
    public void method2(java.lang.String s) throws RemoteException;

par cette ligne.

 
Sélectionnez
public String hello() throws RemoteException;

Modification du client pour qu'il appelle la méthode de l'EJB qui va permettre d'afficher « Hello World ».
Remplacez la méthode

 
Sélectionnez
bean.method1();

par cette ligne.

 
Sélectionnez
System.out.println(bean.hello());

Une personne m'a judicieusement fait remarquer qu'une NamingException était capturée et affichée deux fois, ce qui est inutile.
Remplacez simplement cette méthode

 
Sélectionnez
static private Context getInitialContext()throws NamingException{
      String url = "rmi://localhost:1099";
      
     try
     {
        // Get an InitialContext
        Properties h = new Properties();
        h.put(Context.INITIAL_CONTEXT_FACTORY,
          "com.sun.jndi.rmi.registry.RegistryContextFactory");
        h.put(Context.PROVIDER_URL, url);
        return new InitialContext(h);
      }
      catch(NamingException ne)
      {
          ne.printStackTrace();
          throw ne;
      }
    }

par celle-ci.

 
Sélectionnez
static private Context getInitialContext()throws NamingException{
      String url = "rmi://localhost:1099";
      
     // Get an InitialContext
        Properties h = new Properties();
        h.put(Context.INITIAL_CONTEXT_FACTORY,
          "com.sun.jndi.rmi.registry.RegistryContextFactory");
        h.put(Context.PROVIDER_URL, url);
        return new InitialContext(h);
      }

Il ne reste plus enfin qu'à enlever certaines lignes inutiles dans les descripteurs de déploiement.

  • Les balises décrivant les propriétés d'environnement dans le fichier helloWorld.xml.
 
Sélectionnez
<env-entry>
            <env-entry-name>name1</env-entry-name>
            <env-entry-type>java.lang.String</env-entry-type>
            <env-entry-value>value1</env-entry-value>
      </env-entry>
  • Les balises déclarant les références à la fabrique de ressources dans le fichier helloWorld.xml. Inutile dans notre cas puisque nous n'utilisons pas par exemple de connexion JDBC
 
Sélectionnez
<resource-ref>
    <res-ref-name>jdbc/mydb</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Application</res-auth>
      </resource-ref>
  • Les balises déclarant la ressource qui est mentionnée dans le code de notre EJB.
    Comme nous n'avons pas déclaré de ressources dans notre code, cette balise ne sert strictement à rien.
 
Sélectionnez
<jonas-resource>
      <res-ref-name>jdbc/mydb</res-ref-name>
      <jndi-name>jdbc_1</jndi-name>
    </jonas-resource>

Votre EJB est enfin prêt.


précédentsommairesuivant

Ce document est issu de https://www.developpez.com et reste la propriété exclusive de son auteur.
La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.