Vous utilisez XDoclet pour générer vos EJBs ? Vous avez essayé d’utiliser les generics dans le prototype des méthodes des EJBs ? Dans ce cas, vous avez sûrement rencontré l’erreur suivante :

Buildfile: C:/projects/workspace-mycompany/.metadata/.plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/tempAnt.xml
init:
ejbdoclet:
[ejbdoclet] (XDocletMain.start                   47  ) Running <deploymentdescriptor/>
[ejbdoclet] Generating EJB deployment descriptor (ejb-jar.xml).
[ejbdoclet] Error parsing File C:/projects/workspace-mycompany/myproject-ejb/ejbModule/com/mycompany/myproject/ejb/MyServiceBean.java:Encountered "<" at line 288, column 56.
[ejbdoclet] Was expecting one of: [ejbdoclet] <IDENTIFIER> ...
[ejbdoclet] "[" ... [ejbdoclet] "." ...
[ejbdoclet] (XDocletMain.start                   47  ) Running <remoteinterface/>
[ejbdoclet] Generating Remote interface for 'com.mycompany.myproject.ejb.MyServiceBean'.
[ejbdoclet] (TemplateEngine.invokeMethod         547 ) Invoking method failed: xdoclet.modules.ejb.intf.InterfaceTagsHandler.extendsFrom, line=10 of template file: jar:file:/C:/JONAS_4_7_5/addons/xdoclet-1.2.3/lib/xdoclet-ejb-module-1.2.3.jar!/xdoclet/modules/ejb/intf/resources/remote.xdt
[ejbdoclet] java.lang.reflect.InvocationTargetException
[ejbdoclet] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[ejbdoclet] at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
[ejbdoclet] at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
[ejbdoclet] at java.lang.reflect.Method.invoke(Unknown Source)
[ejbdoclet] at xdoclet.template.TemplateEngine.invoke(TemplateEngine.java:641)
[ejbdoclet] at xdoclet.template.TemplateEngine.invokeMethod(TemplateEngine.java:540)
[ejbdoclet] at xdoclet.template.TemplateEngine.invokeContentMethod(TemplateEngine.java:620)
[ejbdoclet] at xdoclet.template.TemplateEngine.handleTag(TemplateEngine.java:475)
[ejbdoclet] at xdoclet.template.TemplateEngine.generate(TemplateEngine.java:348)
[ejbdoclet] at xdoclet.template.TemplateEngine.start(TemplateEngine.java:415)
[ejbdoclet] at xdoclet.TemplateSubTask.startEngine(TemplateSubTask.java:562)
[ejbdoclet] at xdoclet.TemplateSubTask.generateForClass(TemplateSubTask.java:779)
[ejbdoclet] at xdoclet.TemplateSubTask.startProcessPerClass(TemplateSubTask.java:679)
[ejbdoclet] at xdoclet.TemplateSubTask.startProcess(TemplateSubTask.java:596)
[ejbdoclet] at xdoclet.TemplateSubTask.execute(TemplateSubTask.java:487)
[ejbdoclet] at xdoclet.XDocletMain.start(XDocletMain.java:48)
[ejbdoclet] at xdoclet.DocletTask.start(DocletTask.java:468)
[ejbdoclet] at xjavadoc.ant.XJavadocTask.execute(XJavadocTask.java:105)
[ejbdoclet] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:275)
[ejbdoclet] at org.apache.tools.ant.Task.perform(Task.java:364)
[ejbdoclet] at org.apache.tools.ant.Target.execute(Target.java:341)
[ejbdoclet] at org.apache.tools.ant.Target.performTasks(Target.java:369)
[ejbdoclet] at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1216)
[ejbdoclet] at org.apache.tools.ant.Project.executeTarget(Project.java:1185)
[ejbdoclet] at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:40)
[ejbdoclet] at org.eclipse.ant.internal.ui.antsupport.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32)
[ejbdoclet] at org.apache.tools.ant.Project.executeTargets(Project.java:1068)
[ejbdoclet] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.run(InternalAntRunner.java:423)
[ejbdoclet] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.main(InternalAntRunner.java:137)
[ejbdoclet] Caused by: java.lang.NullPointerException
[ejbdoclet] at xdoclet.modules.ejb.EjbTagsHandler.extendsFromFor(EjbTagsHandler.java:895)
[ejbdoclet] at xdoclet.modules.ejb.intf.InterfaceTagsHandler.extendsFrom(InterfaceTagsHandler.java:698)
[ejbdoclet] ... 29 more
[ejbdoclet] xdoclet.template.TemplateException: Invoking method in class xdoclet.modules.ejb.intf.InterfaceTagsHandler failed: extendsFrom, line=10 of template file: jar:file:/C:/JONAS_4_7_5/addons/xdoclet-1.2.3/lib/xdoclet-ejb-module-1.2.3.jar!/xdoclet/modules/ejb/intf/resources/remote.xdt, exception: null
[ejbdoclet] at xdoclet.template.TemplateEngine.invokeMethod(TemplateEngine.java:548)
[ejbdoclet] at xdoclet.template.TemplateEngine.invokeContentMethod(TemplateEngine.java:620)
[ejbdoclet] at xdoclet.template.TemplateEngine.handleTag(TemplateEngine.java:475)
[ejbdoclet] at xdoclet.template.TemplateEngine.generate(TemplateEngine.java:348)
[ejbdoclet] at xdoclet.template.TemplateEngine.start(TemplateEngine.java:415)
[ejbdoclet] at xdoclet.TemplateSubTask.startEngine(TemplateSubTask.java:562)
[ejbdoclet] at xdoclet.TemplateSubTask.generateForClass(TemplateSubTask.java:779)
[ejbdoclet] at xdoclet.TemplateSubTask.startProcessPerClass(TemplateSubTask.java:679)
[ejbdoclet] at xdoclet.TemplateSubTask.startProcess(TemplateSubTask.java:596)
[ejbdoclet] at xdoclet.TemplateSubTask.execute(TemplateSubTask.java:487)
[ejbdoclet] at xdoclet.XDocletMain.start(XDocletMain.java:48)
[ejbdoclet] at xdoclet.DocletTask.start(DocletTask.java:468)
[ejbdoclet] at xjavadoc.ant.XJavadocTask.execute(XJavadocTask.java:105)
[ejbdoclet] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:275)
[ejbdoclet] at org.apache.tools.ant.Task.perform(Task.java:364)
[ejbdoclet] at org.apache.tools.ant.Target.execute(Target.java:341)
[ejbdoclet] at org.apache.tools.ant.Target.performTasks(Target.java:369)
[ejbdoclet] at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1216)
[ejbdoclet] at org.apache.tools.ant.Project.executeTarget(Project.java:1185)
[ejbdoclet] at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:40)
[ejbdoclet] at org.eclipse.ant.internal.ui.antsupport.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32)
[ejbdoclet] at org.apache.tools.ant.Project.executeTargets(Project.java:1068)
[ejbdoclet] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.run(InternalAntRunner.java:423)
[ejbdoclet] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.main(InternalAntRunner.java:137)
[ejbdoclet] (XDocletMain.start                   53  ) Running XDoclet failed.
[ejbdoclet] (XDocletMain.start                   54  ) <<Running XDoclet failed.>>
[ejbdoclet] xdoclet.template.TemplateException: Invoking method in class xdoclet.modules.ejb.intf.InterfaceTagsHandler failed: extendsFrom, line=10 of template file: jar:file:/C:/JONAS_4_7_5/addons/xdoclet-1.2.3/lib/xdoclet-ejb-module-1.2.3.jar!/xdoclet/modules/ejb/intf/resources/remote.xdt, exception: null
[ejbdoclet] at xdoclet.template.TemplateEngine.invokeMethod(TemplateEngine.java:548)
[ejbdoclet] at xdoclet.template.TemplateEngine.invokeContentMethod(TemplateEngine.java:620)
[ejbdoclet] at xdoclet.template.TemplateEngine.handleTag(TemplateEngine.java:475)
[ejbdoclet] at xdoclet.template.TemplateEngine.generate(TemplateEngine.java:348)
[ejbdoclet] at xdoclet.template.TemplateEngine.start(TemplateEngine.java:415)
[ejbdoclet] at xdoclet.TemplateSubTask.startEngine(TemplateSubTask.java:562)
[ejbdoclet] at xdoclet.TemplateSubTask.generateForClass(TemplateSubTask.java:779)
[ejbdoclet] at xdoclet.TemplateSubTask.startProcessPerClass(TemplateSubTask.java:679)
[ejbdoclet] at xdoclet.TemplateSubTask.startProcess(TemplateSubTask.java:596)
[ejbdoclet] at xdoclet.TemplateSubTask.execute(TemplateSubTask.java:487)
[ejbdoclet] at xdoclet.XDocletMain.start(XDocletMain.java:48)
[ejbdoclet] at xdoclet.DocletTask.start(DocletTask.java:468)
[ejbdoclet] at xjavadoc.ant.XJavadocTask.execute(XJavadocTask.java:105)
[ejbdoclet] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:275)
[ejbdoclet] at org.apache.tools.ant.Task.perform(Task.java:364)
[ejbdoclet] at org.apache.tools.ant.Target.execute(Target.java:341)
[ejbdoclet] at org.apache.tools.ant.Target.performTasks(Target.java:369)
[ejbdoclet] at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1216)
[ejbdoclet] at org.apache.tools.ant.Project.executeTarget(Project.java:1185)
[ejbdoclet] at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:40)
[ejbdoclet] at org.eclipse.ant.internal.ui.antsupport.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32)
[ejbdoclet] at org.apache.tools.ant.Project.executeTargets(Project.java:1068)
[ejbdoclet] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.run(InternalAntRunner.java:423)
[ejbdoclet] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.main(InternalAntRunner.java:137)
[ejbdoclet] C:projectsworkspace-mycompany.metadata.pluginsorg.eclipse.jst.j2ee.ejb.annotations.xdoclettempAnt.xml:69: XDoclet failed.
[ejbdoclet] at xdoclet.DocletTask.start(DocletTask.java:471)
[ejbdoclet] at xjavadoc.ant.XJavadocTask.execute(XJavadocTask.java:105)
[ejbdoclet] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:275)
[ejbdoclet] at org.apache.tools.ant.Task.perform(Task.java:364)
[ejbdoclet] at org.apache.tools.ant.Target.execute(Target.java:341)
[ejbdoclet] at org.apache.tools.ant.Target.performTasks(Target.java:369)
[ejbdoclet] at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1216)
[ejbdoclet] at org.apache.tools.ant.Project.executeTarget(Project.java:1185)
[ejbdoclet] at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:40)
[ejbdoclet] at org.eclipse.ant.internal.ui.antsupport.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32)
[ejbdoclet] at org.apache.tools.ant.Project.executeTargets(Project.java:1068)
[ejbdoclet] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.run(InternalAntRunner.java:423)
[ejbdoclet] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.main(InternalAntRunner.java:137)
[ejbdoclet] Caused by: xdoclet.XDocletException: Running XDoclet failed.
[ejbdoclet] at xdoclet.TemplateSubTask.generateForClass(TemplateSubTask.java:788)
[ejbdoclet] at xdoclet.TemplateSubTask.startProcessPerClass(TemplateSubTask.java:679)
[ejbdoclet] at xdoclet.TemplateSubTask.startProcess(TemplateSubTask.java:596)
[ejbdoclet] at xdoclet.TemplateSubTask.execute(TemplateSubTask.java:487)
[ejbdoclet] at xdoclet.XDocletMain.start(XDocletMain.java:48)
[ejbdoclet] at xdoclet.DocletTask.start(DocletTask.java:468)
[ejbdoclet] ... 12 more
[ejbdoclet] - - - Nested Exception - - -
[ejbdoclet] xdoclet.XDocletException: Running XDoclet failed.
[ejbdoclet] at xdoclet.TemplateSubTask.generateForClass(TemplateSubTask.java:788)
[ejbdoclet] at xdoclet.TemplateSubTask.startProcessPerClass(TemplateSubTask.java:679)
[ejbdoclet] at xdoclet.TemplateSubTask.startProcess(TemplateSubTask.java:596)
[ejbdoclet] at xdoclet.TemplateSubTask.execute(TemplateSubTask.java:487)
[ejbdoclet] at xdoclet.XDocletMain.start(XDocletMain.java:48)
[ejbdoclet] at xdoclet.DocletTask.start(DocletTask.java:468)
ejbdoclet] at xjavadoc.ant.XJavadocTask.execute(XJavadocTask.java:105)
[ejbdoclet] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:275)
[ejbdoclet] at org.apache.tools.ant.Task.perform(Task.java:364)
[ejbdoclet] at org.apache.tools.ant.Target.execute(Target.java:341)
[ejbdoclet] at org.apache.tools.ant.Target.performTasks(Target.java:369)
[ejbdoclet] at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1216)
[ejbdoclet] at org.apache.tools.ant.Project.executeTarget(Project.java:1185)
[ejbdoclet] at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:40)
[ejbdoclet] at org.eclipse.ant.internal.ui.antsupport.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32)
[ejbdoclet] at org.apache.tools.ant.Project.executeTargets(Project.java:1068)
[ejbdoclet] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.run(InternalAntRunner.java:423)
[ejbdoclet] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.main(InternalAntRunner.java:137)
BUILD FAILED C:projectsworkspace-mycompany.metadata.pluginsorg.eclipse.jst.j2ee.ejb.annotations.xdoclettempAnt.xml:69: Unexpected error Total time: 6 seconds

Comme l’équipe de XDoclet ne semble pas travailler sur le sujet[1], Nicolas Leroux s’est penché sur le problème et propose une version modifiée de XDoclet 1.2 et 1.3 supportant les generics.

D’après l’auteur, cette version fonctionne sous JBoss IDE 3.1. Personnellement, je l’ai intégré dans Eclipse 3.2 avec WTP 1.5. Pour celà, il faut remplacer[2] les fichiers présents dans le répertoire lib de XDoclet xdoclet-1.2.3.jar, xdoclet-ejb-module-1.2.3.jar et xjavadoc-1.1.jar par xdoclet-1.3-08012006-lunatech.jar et xdoclet-ejb-module-1.3-08012006-lunatech.jar et xjavadoc-1.5-29012006-lunatech.jar. Il faut également ajouter le JAR de Dom4j 1.6.1 dans le répertoire lib de XDoclet.

Attention, Eclipse n’indique plus qu’il trouve les bibliothèques de XDoclet comme ci-dessous :

Configuration de XDoclet dans Eclipse

Configuration de XDoclet dans Eclipse

De plus, le build automatique de XDoclet ne semble plus fonctionner. Cependant, en lancant le build XDoclet manuellement, les EJBs sont correctement générés.Mise à jour du 27/07/06 : en renommant les JAR modifiés avec leur nom original dans XDoclet, tout fonctionne correctement dans Eclipse avec WTP.

Avec cette personnalisation, vous pouvez maintenant bénéficier des avantages des generics lorsque vous développerez vos EJBs.

Notes

[1] Elle est peut-être trop occupée par XDoclet 2.

[2] Pour celà, il faut renommer la version modifiée avec les noms de la version originale.