Travaux pratiques J2EE
© 2004 Jean-Marc Vanel
e-mail: Envoyer vos commentaires - Ma page d'accueil - Table des matières
Dernière mise à jour:

Ceci est le journal, relativement brut, de mes Travaux pratiques J2EE. J'ai commencé en suivant l'article de Jean-Baptiste Onofré sur JBoss dans Linux Magazine no 60 d'avril 2004. Je travaille sur Fedora Core 1 avec le JDK Sun 1.4.2. En septembre 2002 j'avais déjà pratiqué ( HOWTO run JBoss 3.0 examples ) mais cette fois j'ai l'intention d'aller plus loin avec JBoss 3.2.3.
Vous trouverez les sources sur le WebCVS de Jean-Baptiste Onofré :
http://cvs.nanthrax.net/cgi-bin/viewcvs.cgi/jboss_linuxmag/
Il y a "Download tarball" <http://cvs.nanthrax.net/cgi-bin/viewcvs.cgi/jboss_linuxmag.tar.gz?view=tar> en bas de la page.

-

Questions


Réponses

-

2004-04-13

Exemples du livre Entreprise JavaBeans de Monson-Haefel

Je télécharge les exemples du livre Entreprise JavaBeans de Monson-Haefel (3ème édition):
<>JBoss 3.2 Workbook and Examples Workbook PDF and Example Code (2.8 MB ZIP Fil

Le 4ème édition paraitra en juin. Je n'ai que la 2ème en Français :-( . Pendant que j'y suis je prends aussi les exemples de l'édition 2:
http://examples.oreilly.com/entjbeans2/

2004-04-12

Exercice: "portage" sur ObjectWeb

Il existe une documentation en français :
http://jonas.objectweb.org/doc/jonas-doc-fr-jonas3.3.6.pdf
Le reste de la doc. est ici : Online documentation (last version of JOnAS)

Installation d'une application web: snipsnap

snipsnap est un moteur de forum du genre Wiki, avec ou sans utilisation de base relationnelle. Je le fais tourner sans aucun problème dans ObjectWeb:
$ cd $JONAS_ROOT
$ bin/unix/jonas admin -a ~/distribs/snipsnap-0.5.1a.war
Ensuite l'application est disponible à l'URL http://locahost:8088/snipsnap-0.5.1a/

2004-04-11

Exercice: "portage" sur ObjectWeb

Essai d'un déploiement d'un .ear pour JBoss

Il y a des guillemets à "portage" parce qu'en théorie, ce devrait être très portable. Je sais déjà que les descripteurs objet-relationnel ne le sont pas. Ces choses ne marchent pas du premier coup ... Surtout que j'ai pris le risque de déloyer le .ear qui tourne sur JBoss tel quel :
export JONAS_ROOT=/home/jmv/usr2/jonas-3-3-6 
jmv@protea:/home/jmv/usr2/jonas-3-3-6$ ./bin/unix/jonas admin \
-a $JBOSS_HOME/server/default/deploy/linuxmag.ear
Voilà ce que  ça donne côté serveur :
jmv@protea:/home/jmv/usr2/jonas-3-3-6/bin/unix$ 2004-04-11 15:38:17,336 : EjbDeploymentDescManager.getDeploymentDescriptor : Cannot read the XML deployment descriptors for /home/jmv/usr2/jonas-3-3-6/apps/jonas/linuxmag_2004.04.11-10.47.02/linuxmag.jar:
java.lang.NullPointerException
at java.util.zip.ZipFile.getInputStream(ZipFile.java:184)
at org.objectweb.jonas_ejb.deployment.lib.EjbDeploymentDescManager.getDeploymentDescriptor(EjbDeploymentDescManager.java:941)
at org.objectweb.jonas_ejb.deployment.lib.EjbDeploymentDescManager.loadDeploymentDesc(EjbDeploymentDescManager.java:335)
at org.objectweb.jonas_ejb.deployment.lib.EjbDeploymentDescManager.getDeploymentDesc(EjbDeploymentDescManager.java:236)
at org.objectweb.jonas.container.EJBServiceImpl.createContainer(EJBServiceImpl.java:488)
at org.objectweb.jonas.container.EJBServiceImpl.deployJars(EJBServiceImpl.java:1010)
at org.objectweb.jonas.ear.EarServiceImpl.deployEar(EarServiceImpl.java:813)
at org.objectweb.jonas.ear.EarServiceImpl.deployEarMBean(EarServiceImpl.java:926)
at org.objectweb.jonas.adm.Adm.addEar(Adm.java:250)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:261)
at org.objectweb.carol.rmi.jrmp.server.JUnicastServerRef.runDispatch(JUnicastServerRef.java:165)
at org.objectweb.carol.rmi.jrmp.server.JUnicastServerRef.dispatch(JUnicastServerRef.java:149)
at sun.rmi.transport.Transport$1.run(Transport.java:148)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:144)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:460)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:701)
at java.lang.Thread.run(Thread.java:534)
2004-04-11 15:38:17,394 : EJBServiceImpl.createContainer : Cannot read the deployment descriptors '/home/jmv/usr2/jonas-3-3-6/apps/jonas/linuxmag_2004.04.11-10.47.02/linuxmag.jar': org.objectweb.jonas_ejb.deployment.api.DeploymentDescException: Cannot read the XML deployment descriptors for /home/jmv/usr2/jonas-3-3-6/apps/jonas/linuxmag_2004.04.11-10.47.02/linuxmag.jar:java.lang.NullPointerException
2004-04-11 15:38:17,402 : EJBServiceImpl.deployJars : Error when deploying '/home/jmv/usr2/jonas-3-3-6/apps/jonas/linuxmag_2004.04.11-10.47.02/linuxmag.jar'
2004-04-11 15:38:17,416 : EJBServiceImpl.deployJars : Cannot read the XML deployment descriptors for /home/jmv/usr2/jonas-3-3-6/apps/jonas/linuxmag_2004.04.11-10.47.02/linuxmag.jar:java.lang.NullPointerException: org.objectweb.jonas_ejb.deployment.api.DeploymentDescException: Cannot read the XML deployment descriptors for /home/jmv/usr2/jonas-3-3-6/apps/jonas/linuxmag_2004.04.11-10.47.02/linuxmag.jar:java.lang.NullPointerException
2004-04-11 15:38:17,420 : EJBServiceImpl.deployJars : Undeploy ejb-jar of the ear application
2004-04-11 15:38:17,430 : EarServiceImpl.deployEar : Error during the deployment of the jars files of the Ear file /home/jmv/opt2/jboss-3.2.3/server/default/deploy/linuxmag.ear': Error during the deployment: org.objectweb.jonas.service.ServiceException : Cannot read the XML deployment descriptors for /home/jmv/usr2/jonas-3-3-6/apps/jonas/linuxmag_2004.04.11-10.47.02/linuxmag.jar:java.lang.NullPointerException: org.objectweb.jonas_ejb.deployment.api.DeploymentDescException: Cannot read the XML deployment descriptors for /home/jmv/usr2/jonas-3-3-6/apps/jonas/linuxmag_2004.04.11-10.47.02/linuxmag.jar:java.lang.NullPointerException

Accessoirement on remarque que la pile d'appel est beaucoup moins profonde qu'avec JBoss. Aparemment le linuxmag.jar ne lui plaît pas, mais côté console déploiement c'est plutôt ceci:
Cannot read the XML deployment descriptors for 
/home/jmv/usr2/jonas-3-3-6/apps/jonas/linuxmag_2004.04.11-10.47.02/linuxmag.jar:
java.lang.NullPointerException
Voici le contenu exact de cette archive qui pose problème :
unzip -l  $jboss_exemple/build/linuxmag.jar 
Archive: /home/jmv/contrats/formation-j2ee/jboss/jboss_linuxmag//build/linuxmag.jar
Length Date Time Name
-------- ---- ---- ----
0 04-11-04 10:46 META-INF/
103 04-11-04 10:46 META-INF/MANIFEST.MF
0 04-11-04 10:46 META-INF/lib/
0 04-11-04 10:46 org/
0 04-11-04 10:46 org/linuxmag/
0 04-11-04 10:46 org/linuxmag/jboss/
0 04-11-04 10:46 org/linuxmag/jboss/ejb/
3658 04-11-04 10:46 META-INF/ejb-jar.xml
598 04-11-04 10:46 META-INF/jboss.xml
1451 04-11-04 10:46 META-INF/jbosscmp-jdbc.xml
209915 04-11-04 10:46 META-INF/lib/pg74.1jdbc3.jar
1675 04-11-04 10:46 org/linuxmag/jboss/ejb/LinuxmagBean.class
381 04-11-04 10:46 org/linuxmag/jboss/ejb/LinuxmagLocal.class
629 04-11-04 10:46 org/linuxmag/jboss/ejb/LinuxmagLocalHome.class
215 04-11-04 10:46 org/linuxmag/jboss/ejb/LinuxmagSession.class
1452 04-11-04 10:46 org/linuxmag/jboss/ejb/LinuxmagSessionBean.class
267 04-11-04 10:46 org/linuxmag/jboss/ejb/LinuxmagSessionHome.class
-------- -------
220344 17 files

Je crois qu'il est temps de faire tourner un exemple d'ObjectWeb pour pouvoir comparer tout ça.
Mais d'abord profiter des derniers rayons de soleil de ce dimanche de Paques ...

Petit exemple sb de JonAS

J'ai fait tourner sans problèmes l'exemple sb de JonAS qui n'utilise qu'un SessionBean, mais avec des transactions. Et là je m'aperçois que le contenu d' un jar pour JonAS est très différent d'un jar pour JBoss. Un jar pour JonAS contient des talons et des squelettes (stubs & squeletons), alors que pour JBoss il n'y a que les sources rédigés par le développeur. En cela JonAS est-il conforme au standard EJB ?

Exercice: page de saisie pour ajouter des objets

Suite au problème javax.ejb.CreateException d'hier, je tente de changer LinuxmagLocal pour qu'il étende EJBObject au lieu de EJBLocalObject. Hélas ça crée des incohérences avec les fichiers XML de déploiement :
07:38:01,245 WARN  [verifier] EJB spec violation: 
Bean : Linuxmag
Section: 12.2.10
Warning: Entity bean's local interface must extend the javax.ejb.EJBLocalObject interface.

07:38:01,273 WARN [verifier] EJB spec violation:
Bean : Linuxmag
Method : public abstract void remove() throws RemoteException, RemoveException
Section: 12.2.10
Warning: The methods in the local interface must not include java.rmi.RemoteException in their throws clause.
................
07:38:01,307 WARN [verifier] EJB spec violation:
Bean : Linuxmag
Method : public abstract void remove() throws RemoteException, RemoveException
Section: 12.2.10
Warning: For each method defined in the local interface, there must be a matching method in the entity bean's class that has the same name and argument types.
Soit je corrige ces incohérences avec les fichiers XML de déploiement, soit je répercute dans le LinuxmagSession une méthode pour créer un objet.

Je regarde un intéressant exemple Sun avec un EJBLocalObject, qui s'occupe de courrier électronique. Et là je m'aperçois qu'il manquait quelque chose de capital dans le source de JB Onofré, dans la classe LinuxmagBean :
  // Méthode EJB qui crée l'objet en base de données
public Integer ejbCreate(Integer number, Date date, String mainTitle) throws CreateException {
System.out.println("Linuxmag CMP Entity Bean Create");
setNumber(number);
setDate(date);
setMainTitle(mainTitle);
return number;
}
Sans ces trois appels, l'objet restait vide, bien sûr.

Maintenant ça marche !!!
http://localhost:8088/linuxmag/addItem.jsp?number=333&date=Sat%2C+12+Aug+1995+13%3A30%3A00+GMT&maintitle=titre+jmv


2004-04-10

Exercice: page de saisie pour ajouter des objets

Aujourd'hui je fais l'exercice naturel de faire une page de saisie pour ajouter des objets LinuxMag dans la base.
Ca ne marche pas du premier coup :
date: Sat, 12 Aug 1995 13:30:00 GMT
, number: 223
, maintitle: titre jmv
Exception: javax.ejb.CreateException: Could not create
entity:java.sql.SQLException: ERROR: ExecInsert: Fail to add null value
in not null attribute number
J'avais fait ceci en JSP comme page de saisie pour ajouter des objets LinuxMag :
<%
String date = request.getParameter("date");
out.println( "date: " + date );
String number = request.getParameter("number");
out.println( ", number: " + number );
String maintitle = request.getParameter("maintitle");
out.println( ", maintitle: " + maintitle );
out.println( "<br>");

try {
InitialContext context = new InitialContext();
// note : pas bon de faire accès directement à un objet local je crois
LinuxmagLocalHome linuxmaghome = (LinuxmagLocalHome)context.lookup("linuxmag/Linuxmag");
out.println("LinuxmagLocalHome Bean Method Call: create()");
linuxmaghome.create(new Integer(number), new java.util.Date(date), maintitle);
out.println( "OK, objet ajouté<br>");

} catch(Exception e) {
out.println("Exception: " + e);
}
%>
<a href="index.jsp">Retourner à page accueil Linuxmag</a>
Clairement c'est
linuxmaghome.create()
qui ne passe pas. Dans ejb-jar.xml il y a:
      <primkey-field>number</primkey-field>
et dans conf/ejb/jbosscmp-jdbc.xml il n'y a rien de tel, mais dans les deux il y a l'indication de la correspondance entre les champs Java et les champs relationnels.

Changer de base relationnelle

JBoss serait-il peu compatible avec PostgreSQL ?
NON. Le message est essentiellement le même avec Hypersonic SQL, la base livrée avec JBoss:
Exception: javax.ejb.CreateException: Could not create
entity:java.sql.SQLException: Try to insert null into a non-nullable
column in statement [INSERT INTO LINUXMAG (number, date, maintitle)
VALUES (NULL, NULL, NULL)]
Le changement de base se fait dans jbosscmp-jdbc.xml :
<datasource>java:/DefaultDS</datasource>
<datasource-mapping>Hypersonic SQL</datasource-mapping>

2004-04-09

Installation de JBoss


2004-04-08

Installation de JBoss

2004-04-07

Installation de JBoss

# sudo -u jboss ./run.sh
## ..... messages ...
07:53:41,074 INFO [Server] JBoss (MX MicroKernel) [3.2.3 (build: CVSTag=JBoss_3_2_3 date=200311301445)] Started in 3m:55s:48ms

# /sbin/iptables -I INPUT -p tcp --source-port 4444 -i ppp0 -j DROP
Problèmes :

2004-04-05

Installation de JBoss

J.B. Onofré, auteur de l'article dans Linux Magazine: Vous trouverez les sources sur le WebCVS :
http://cvs.nanthrax.net/cgi-bin/viewcvs.cgi/jboss_linuxmag/

Il y a Download tarball <http://cvs.nanthrax.net/cgi-bin/viewcvs.cgi/jboss_linuxmag.tar.gz?view=tar>
en bas de la page.

2004-04-03

Installation de JBoss

Les (petits) ennuis commencent !
$ sudo -u jboss ./run.sh
run.sh: Missing required file: /home/jmv/opt2/jboss-3.2.3/bin/run.jar
# ls -l /home/jmv/opt2/jboss-3.2.3/bin/run.jar
-rwxrwsr-x 1 jboss jboss 30186 nov 30 21:45 /home/jmv/opt2/jboss-3.2.3/bin/run.jar
La raison était que toute la chaîne de répertoires n'était pas lisible par le compte jboss. A noter que :
$ export JBOSS_HOME=/home/jmv/opt2/jboss-3.2.3 
n'est pas nécessaire. Ensuite tous les services JBoss mettent 4 minutes à se lancer sur mon 500MHz :-( .

2004-04-02

Installation de JBoss

Je suis l'article de Jean-Baptiste Onofré sur Linux Magazine. J'ai fini l'installation (page 28).

Sur Fedora, addgroup n'existe pas, et adduser est different. Il doit utiliser Debian. J'utilise donc redhat-config-users .

Hyperliens - références

Vous trouverez les sources sur le WebCVS de Jean-Baptiste Onofré :
http://cvs.nanthrax.net/cgi-bin/viewcvs.cgi/jboss_linuxmag/
Il y a "Download tarball" <http://cvs.nanthrax.net/cgi-bin/viewcvs.cgi/jboss_linuxmag.tar.gz?view=tar> en bas de la page.