2010-07-20 6 views
4

J'ai lutté pour cela pendant un moment maintenant. J'essaie de préparer EJB 3.0. J'utilise JBoss 5.1.0 GA comme serveur d'application. J'ai commencé avec un bean de session sans état très simple avec une interface locale et un simple client jsp-servlet qui appelle la méthode du bean session. Tout cela pendant que j'essayais d'utiliser l'annotation @EJB pour injecter le bean session dans la classe de servlet.@EJB dans JBoss 5.1.0 GA?

public class SampleServlet extends HttpServlet { 

    @EJB 
    private PersonLocal person; 

    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException { 
     System.out.println("In servlet");  
     response.getWriter().write("Person Name : "+person.getName()); 
     System.out.println(person.getName());  
    } 
} 

J'utilise JBoss 5.1.0 GA avec la configuration par défaut . (J'ai également essayé avec toute la configuration)

Cependant, j'avais l'habitude d'obtenir une référence nulle à l'injection de bean session. Après avoir lutté pendant un jour ou deux, j'ai finalement essayé la moche méthode de recherche EJB 2.x JNDI au lieu de @EJB annotation avec la configuration pour jndi spécifié dans le fichier jndi.properties et cela a fonctionné sans aucun autre changement!

Maintenant, j'ai essayé de trouver dans les documents de JBoss si JBoss 5.1.0 GA supportait ou non l'injection avec l'annotation @EJB, mais n'a pas trouvé de réponse concrète. Alors quelqu'un peut-il me dire si c'est le cas? parce que je préférerais vraiment l'annotation sur la recherche JNDI (je veux dire, qui ne le fera pas?). Est-ce que je manque quelque chose ..?

Probablement aurait dû mettre cela dans les forums JBoss, mais .. Je suis accro à cet endroit ;-)

+0

Quelle configuration de serveur JBoss utilisez-vous? 'all',' default', 'minimal', etc. – skaffman

+2

En outre, s'il vous plaît nous montrer du code, par exemple. le servlet – skaffman

+0

a ajouté le code et la configuration du serveur à la question. :) – Nikhil

Répondre

5

Ceci est certainement pris en charge par JBoss 5.x car il est certifié Java EE 5.

En fait, je suggère de vérifier le Chapter 11. Introduction to EJB injection in Servlets du JBoss EJB3 Tutorials, ils décrivent un exemple détaillé et étape par étape.

Et porter une attention particulière à la note suivante:

Pour l'injection doit avoir lieu dans un module Web , votre web.xml doit utiliser la version 2.5 du web-app xsd:

<web-app version="2.5" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
+3

Je me demande combien de questions servlet/jsp sur SO ont été résolues en fixant la «version de l'application web» ..... – skaffman

+1

Cela fixé! :) J'aurais dû lire les tutoriels avant de plonger, mais de toute façon .. J'ai appris une bonne leçon.Merci beaucoup! :) – Nikhil

+0

Y a-t-il d'autres gotacha comme ceux-ci lors de l'utilisation de clients Java normaux? Ou pouvons-nous injecter dans les clients Java tel quel? – Nikhil

1

J'ai eu un problème similaire à l'aide d'un EJB distant, mais il n'a pas été en raison de la version web-app, mais plutôt la façon dont mon client était à la recherche l'EJB.

est ici ce qui a fonctionné pour moi:

//bean 
@Stateless(name="xxxxService") 
@Remote(xxxxRemote.class) 
public class xxxxService implements xxxxRemote { 

//interface - note that no annnotation is required 
public interface xxxxRemote { 

//in the client 
    @EJB(mappedName="myJndiNameForxxxx") //for a local ejb, you could use 'beanName=' 
    private xxxxRemote xxxx; 

Pour mon projet (construit avec Maven), le client est dans une webapp, et l'EJB est dans un projet EJB qui est ensuite enveloppé dans un projet EAR. La cartographie JNDI se produit dans jboss.xml, qui vit dans le projet EJB (dans mon projet, src/main/resources/META-INF), et ressemble à ceci:

<?xml version="1.0" encoding="UTF-8"?> 
<jboss xmlns:xs="http://www.jboss.org/j2ee/schema" 
     xs:schemaLocation="http://www.jboss.org/j2ee/schema/jboss_5_0.xsd" 
     version="5.0"> 
    <enterprise-beans> 
    <session> 
     <ejb-name>xxxxService</ejb-name> 
     <jndi-name>myJndiNameForxxxx</jndi-name> 
    </session> 
    </enterprise-beans> 
</jboss> 

C'est tout ce qu'il fallait, et maintenant Je peux accéder à l'EJB du client. J'espère que cela aide quelqu'un.

Si vous rencontrez toujours des problèmes, vous pouvez consulter la console JMX pour vous assurer que l'entrée JNDI s'affiche. Regardez sous 'jboss'> 'service = JNDIview'> 'list' et cliquez sur le bouton 'invoke'. Si votre service est déployé correctement, vous devriez voir le nom JNDI (dans mon exemple, myJndiNameForxxxx) sous 'ProxyFactory'.

+0

Votre réponse n'est pas très pertinente à la question posée, mais toujours comme vous l'avez dit, pourrait être utile à quelqu'un! – Nikhil

Questions connexes