2010-08-20 2 views
2

J'ai créé un fichier EAR avec un projet web, un projet ejb3 et le client ejb. Je suis capable d'appeler les méthodes du bean via l'injection dans le servlet. Je prévois d'utiliser un ServiceDelegate qui est un pojo pour gérer l'appel du bean. Donc, je vais appeler le délégué de mon servlet et le délégué appellera les haricots appropriés et ses méthodes.EJB3 beans Recherche JNDI dans Websphere 7

Mais je ne parviens pas à obtenir les références de bean dans la classe delegate qui se trouve dans le projet web. L'annotation @EJB a renvoyé une référence null. J'ai donc essayé une recherche JNDI avec java: comp/env/EARname/BeanName. Mais je finis toujours avec des exceptions de nommage.

Nom comp/env/EARname introuvable dans le contexte «java:».

S'il vous plaît me suggérer la bonne façon d'appeler les haricots EJB3 via JNDI sur le serveur Websphere 7.

Répondre

2

L'injection de dépendances dans Java EE 5 et 6 fonctionne uniquement pour les classes managées. Dans le conteneur de servlet, ceci est pris en charge dans quelques types de classes, et pas dans tous les POJO (malheureusement).

le servlet Spec 2.5 éclaire les classes pour lesquelles le récipient doit injectent des dépendances si elles sont présentes:


Type Composant: servlets

Classes mettant en œuvre les interfaces suivantes

  • javax.servlet.Servlet

Type de composant: Filtres

classes implémentant les interfaces suivantes:

  • javax.servlet.Filter

Composant Type:

Listeners

classes implémentant les interfaces suivantes:

  • javax.servlet.ServletContextListener
  • javax.servlet.ServletContextAttributeListener
  • javax.servlet.ServletRequestListener
  • javax.servlet.ServletRequestAttributeListener
  • javax.servlet.http.HttpSessionListener
  • javax.servlet.http.HttpSessionAttributeListener

Par conséquent, si vous devez résoudre le problème avec les recherches de dépendance, vous pouvez adopter l'une des stratégies suivantes:

  • Injecter la dépendance dans une classe gérée, et se propager à le ServiceDelegate. C'est une odeur de conception à mon humble avis.
  • Effectuez une recherche JNDI à l'aide de InitialContext, mais vous devez connaître les liaisons JNDI générées pour les EJB que vous avez déployés. Cela semble échouer car le nom JNDI peut être incorrect - la spécification Java EE n'a pas standardisé les noms JNDI affectés aux EJB déployés. En d'autres termes, étant donné l'absence de noms JNDI portatifs, vous devez tenter de lier l'EJB à un nom connu et effectuer une recherche de celui-ci.
  • Vous devrez vérifier que l'objet de session EJB est bien lié à l'espace de noms java: comp/env. Cela pourrait ne pas être le cas. Pour être clair, si la dépendance n'est pas injectée par le conteneur, alors il faut déclarer les entrées de référence EJB locales dans web.xml. Le conteneur n'injectera pas automatiquement les objets EJB de session dans l'espace de noms de la servlet. il faudra que l'EJB soit déclaré en tant que ressource dans une classe gérée. Cela semble être le principal cas d'échec, bien qu'il soit listé en dernier.
+0

Notez que * n'importe quoi * peut être transformé en bean géré dans Java EE 6 avec CDI. –

+0

Je suis confronté au même problème pas tout à fait sûr si pour la même raison je l'ai demandé ici http://stackoverflow.com/questions/6905186/injection-of-ejb3-into-annotation-based-jsf2-backing-bean-causing- javax-naming-na. Pouvez-vous s'il vous plaît expliquer votre point? Je ne suis toujours pas sûr de ce que je dois faire. S'il vous plaît jeter un oeil à ma question pour voir si cela se rapporte. Merci. – Shahzeb

Questions connexes