Discuter:J2eeEtAgilite
Un article de Agile-Swiss.
Pour appuyer tes dires Stéphane sur la complexité inhérente à J2EE et sa verbosité légendaire voici un exemple non caricaturé:
Votre besoin
Vous avez développé une librairie POJO qui offre un service donné et vous souhaitez très, très simplement exposer ce service sur le réseau à l'aide d'une couche EJB. Pour simplifier disons que votre librairie expose une seule interface publique que nous appellerons UpToNowSimple qui possède une seule méthode
public interface UpToNowSimple{
public String helloWorld();
}
vous devez donc créer un EJB qui encapsule cette interface.
Ce qui va vous tomber dessus
- Création de l'interface distante de votre EJB que nous appellerons UpToNowSimpleRemote:
public interface UpToNowSimpleRemote extends EJBObject {
public String helloWorld() throws RemoteException;
}
première désillusion : votre interface distante ne peut être votre interface POJO et ne peut pas non plus étendre votre interface POJO puisque la signature de la méthode doit comporter le throws RemoteException. Les deux interfaces sont donc désynchronisées.
- Création de l'interface Home à partir de laquelle nous pourrons obtenir notre EJB:
public interface UpToNowSimpleHome extends EJBHome {
public UpToNowSimpleRempte create() throws RemoteException, CreateException;
}
- Création de notre EJB:
public class UpToNowSimpleBean implements SessionBean, UpToNowSimple {
private UpToNowSimple upToNowSimple;
public String helloWorld() {
return upToNowSimple.helloWorld();
}
public void ejbCreate(){
upToNowSimple = UpToNowSimpleFactory.createUpToNowSimple();
}
ejbRemove, ejbActivate, .... blablabla
}
vous avez noté que votre EJB et l'interface remote qu'il est censé implémenter ne sont pas liés ;-)
- Création du fichier descripteur ejb-jar.xml:
<?xml version="1.0" encoding="ISO-8859-1"?> <!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>Déscripteur de déploiement de HelloWorld</description> <display-name>HelloWorld</display-name> <enterprise-beans> <session> <description>Déscripteur de déploiement de HelloWorld</description> <display-name>UpToNowSimple</display-name> <ejb-name>UpToNowSimple</ejb-name> <home>UpToNowSimpleHome</home> <remote>UpToNowSimpleRemote</remote> <ejb-class>UpToNowSimpleBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans> <assembly-descriptor> <container-transaction> <method> <ejb-name>UpToNowSimple</ejb-name> <method-name>*</method-name> </method> <trans-attribute>Required</trans-attribute> </container-transaction> </assembly-descriptor> </ejb-jar>
- Création d'un fichier descripteur propre à votre serveur d'application pour lui dire comment binder la référence de votre EJB dans l'arbre JNDI, pour Jonas:
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE jonas-ejb-jar PUBLIC "-//ObjectWeb//DTD JOnAS 2.4//EN" "http://www.objectweb.org/jonas/dtds/jonas-ejb-jar_2_4.dtd"> <jonas-ejb-jar> <jonas-session> <ejb-name>UpToNowSimple</ejb-name> <jndi-name>UpToNowSimple</jndi-name> </jonas-session> </jonas-ejb-jar>
- Création d'une classe cliente relativement simple comme vous pouvez le voir:
public class HelloWorldClient {
public static void main(String args[]) {
// Récupération du contexte initial
Context initialContext = null;
try {
initialContext = new InitialContext();
} catch (Exception e) {
System.err.println("Impossible d'accéder au contexte JNDI : " + e);
System.exit(2);
}
// Récupération d'une référence à l'interface locale
UpToNowSimpleHome home = null;
try {
home =(UpToNowSimpleHome)PortableRemoteObject.narrow(initialContext.lookup("UpToNowSimple"),UpToNowSimpleHome.class);
} catch (Exception e) {
System.err.println( "Impossible de trouver UpToNowSimpleHome: " + e);
System.exit(2);
}
// Création d'un objet de même type que l'interafce distante
// et appel de la fonction helloWorld()
HelloWorldRemote myHelloWorld = null;
try {
myHelloWorld = home.create();
System.out.println(myHelloWorld.helloWorld());
} catch (Exception e) {
System.err.println("Impossible de créer le bean : " + e);
System.exit(2);
}
}
}
Mais pourquoi donc faire simple quand on peut faire si compliqué ?
Freddy
