Websphere pas assez intelligent pour utiliser les « mappedName »

Après quelques jours à chercher comment utiliser les annotations @resource pour spécifier à WebSphere d’utiliser les noms JNDI pour injecter l’information dans mon code, j’ai finalement trouvé comment… à l’aide de la communauté Web.

Voici un résumé du problème:

@Stateless
@Local(AsyncJobManager.class)
public class AsyncJobManagementBean implements AsyncJobManager {
[…]
@Resource(mappedName = « jms/ResultQueue »)
private Queue jobResultQueue;

@Resource(mappedName = « jms/BaseConnectionFactory »)
private ConnectionFactory connectionFactory;
[…]
}

Lorsque déployé, on obtient la réponse suivante du serveur:

« CWNEN0044E: A resource reference binding could not be found for the following resource references [XXXXX.base.facade.AsyncJobManagementBean/jobResultQueue, XXXXX.base.facade.AsyncJobManagementBean/connectionFactory], defined for the AsyncJobManagementBean component. »

En effet, Websphere n’utilises pas le mappedName pour son mapping JDNI. Il faut donc faire 2 choses:

  1. Supprimer le fichier ejb-jar.xml (indique à websphere de se fier seulement sur les annotations)
  2. Fournir un fichier ibm-ejb-jar-bnd.xml qui spécifie les bindings pour les nom glogaux JNDI.

Si on fournit le ejb-jar.xml on aura une erreur du type:

« The value of the <injection-target-class> element is not specified » Base_EJB3/ejbModule/META-INF « Injection target: jobResultQueue »

Référence: www.ibm.com/developerworks/forums/thread.jspa?messageID=14291505