2011-07-26 4 views
3

Folks,JBoss 6: EJB Injections dans servlet

Je suis très ennuyé d'avoir à réapprendre et de perdre du temps avec ce genre de choses à chaque fois une nouvelle version de JBoss roule autour.

J'ai un EJB sans état qui est découvert et déclaré dans l'espace JNDI:

10:01:53,044 INFO [org.jboss.ejb3.proxy.impl.jndiregistrar.JndiSessionRegistrarBase] Binding the following Entries in Global JNDI: 

DTalk/UserManager/local - EJB3.x Default Local Business Interface 
DTalk/UserManager/local-com.doctalk.ejb.UserManagerLocal - EJB3.x Local Business Interface 

-je utiliser ce EJB dans un servlet qui fait partie d'une guerre qui fait partie de l'oreille qui contient les EJB. Je voudrais le faire en utilisant l'injection.

Lorsque j'utilise la notation la plus intuitive:

@EJB 
private UserManager userManager; 

je reçois une exception dans les journaux JBoss.

Lorsque j'utilise une notation plus fleurie tels que:

@EJB(mappedName = "UserManager") 
private UserManager userManager; 

Ou

@EJB(mappedName = "DTalk/UserManager/local") // EAR is called DTalk 
private UserManager userManager; 

Je reçois aucune erreur d'injections dans jboss mais le haricot injecté est nul.

C'est énervant et une perte de temps énorme et me fait me demander pourquoi je ne rejette pas la franchise Eclipse/jboss tools en faveur de NetBeans et GlsssFish.

Toute idée appréciée.

Merci.

+1

Vous semblez avoir une variété d'idées fausses qui ont besoin d'être éclaircies. Les "nouveaux trucs" que vous ne voulez pas réapprendre sont indépendants de JBoss. Ils reflètent les nouvelles spécifications Java. Les nouvelles versions de GlassFish seront, en théorie, mises à jour pour prendre en charge les mêmes nouveaux JSR que JBoss. Personne ne vous oblige à utiliser la nouvelle version de JBoss, non? De plus, vous n'utilisez pas Eclipse/JBoss en tant que paire, ni NetBeans/GlassFish en tant que paire. Les serveurs d'applications sont totalement interopérables avec les principaux IDE. –

+0

Salut Matt, Merci d'avoir écrit. Depuis que j'ai fait une diatribe inutile, je mérite une réponse inutile. Cependant, votre commentaire sur l'interopérabilité des serveurs d'applications avec les principaux IDE est un peu idéaliste. Ils peuvent être interopérables si vous aimez ce genre de choses, ou, disons, agrafez vos oreilles au mur. Cela étant dit, avez-vous une réponse pour moi, ou seulement le retour? – Raj

+0

Quelle est l'exception que vous obtenez lorsque vous utilisez l'injection minimale @EJB private UserManager userManager; –

Répondre

5

Vous essayez d'injecter (un proxy) l'instance du bean elle-même, au lieu de son interface. Cependant, selon le protocole de déploiement que vous avez montré, vous avez seulement déclaré que le bean doit être lié à JNDI via son interface (locale). Afin de rendre l'injection se produit, vous devez soit déclarer la variable dans laquelle vous vous injectez l'interface:

@EJB 
private UserManagerLocal userManager; 

OU déclarer qu'une vue no-interface devrait être créé pour votre haricot:

@Stateless 
@LocalBean 
public class UserManager implements UserManagerLocal { 
    ... 
} 

après quoi vous pouvez déclarer la variable comme vous l'avez fait précédemment:

@EJB 
private UserManager userManager; 
+0

Arjan, Merci pour une réponse très précise et directe. Vous avez attrapé la cause première: je faisais référence à la classe du haricot et non à l'interface. Merci également de m'avoir informé de la vue sans interface EJB3.1. Je vais vérifier cela aussi. – Raj

Questions connexes