2017-09-15 9 views
0

J'ai une application EJB2 fonctionnant sur JBOSS 4.2.3GA et la recherche fonctionne correctement avec: java:comp/env/ejb/MyEJB.Java EJB2 JNDI Look Up Echec lors de la migration de Jboss 4 vers Jboss 6

Lors du passage à JBOSS AS 6.1.Final, il s'est soudainement rompu avec l'exception NameNotFoundException. JNDI View montre que l'EJB est lié à l'arborescence correcte. Mettre un point d'arrêt avant la recherche j'ai pu regarder et confirmer qu'il est lié. En utilisant context.list("java:comp/env/ejb"), j'ai été capable de voir MyEJB dans l'itérateur. L'utilisation de context.lookup("java:comp/env/ejb") fonctionne également. Cependant context.lookup("java:comp/env/ejb/MyEJB") montre NamingException sur la fenêtre de surveillance (et NameNotFoundException lors de l'exécution du code réel).

Y at-il quelque chose de changé que je ne connais pas? Il est très difficile de trouver des informations sur ce sujet EJB et toute information que je trouve suggérer soit confirme ce que je fais bien ou dit d'utiliser ejb/MyEJB qui ne fonctionne pas du tout.

Merci d'avance. J'apprécie ton aide.

ejb-jar.xml:

<session> 
     <ejb-name>AdminSessionEJB</ejb-name> 
     <local-home>com.admin.ejb.business.AdminSessionHome</local-home> 
     <local>com.admin.ejb.business.AdminSession</local> 
     <ejb-class>com.admin.ejb.business.AdminSessionEJB</ejb-class> 
     <session-type>Stateless</session-type> 
     <transaction-type>Container</transaction-type> 
     <ejb-local-ref> 
      <ejb-ref-name>ejb/UserEJB</ejb-ref-name> 
      <ejb-ref-type>Entity</ejb-ref-type> 
      <local-home>com.admin.ejb.entity.UserHome</local-home> 
      <local>com.admin.ejb.entity.User</local> 
      <ejb-link>UserEJB</ejb-link> 
     </ejb-local-ref> 
     <ejb-local-ref> 
      <ejb-ref-name>ejb/UniqueKeyEJB</ejb-ref-name> 
      <ejb-ref-type>Entity</ejb-ref-type> 
      <local-home>com.framework.ejb.entity.UniqueKeyHome</local-home> 
      <local>com.framework.ejb.entity.UniqueKey</local> 
      <ejb-link>UniqueKeyEJB</ejb-link>    
     </ejb-local-ref> 
     <ejb-local-ref> 
      <ejb-ref-name>ejb/UserGroupEJB</ejb-ref-name> 
      <ejb-ref-type>Entity</ejb-ref-type> 
      <local-home>com.admin.ejb.entity.UserGroupHome</local-home> 
      <local>com.admin.ejb.entity.UserGroup</local> 
      <ejb-link>UserGroupEJB</ejb-link> 
     </ejb-local-ref> 
</session> 

jboss.xml:

<enterprise-beans> 
     <entity> 

     <ejb-name>UserEJB</ejb-name> 
     <local-jndi-name>ejb/UserHome</local-jndi-name> 
     <read-only>false</read-only> 
     <configuration-name>UserEJB Container Configuration</configuration-name>    
     <ejb-local-ref> 
      <ejb-ref-name>ejb/UserGroupEJB</ejb-ref-name> 
      <local-jndi-name>ejb/UserGroupHome</local-jndi-name> 
     </ejb-local-ref> 
    </entity> 
</enterprise-beans> 
+0

S'il vous plaît montrer la déclaration XML pour la déclaration d'EJB à partir de votre fichier ejb-jar.xml et le XML correspondant de votre fichier jboss.xml. –

+0

J'ai posté la partie pour juste UserEJB, qui est ce que je suis en train de tester. Faites-moi savoir si vous avez besoin de plus. Merci. – user3758745

+0

Je pense que vous devez supprimer ' ejb/UserHome' du fichier jboss.xml parce que le conteneur doit figurer le lien des entrées ' UserEJB' dans le fichier ejb-jar.xml. De plus, cela n'a pas de sens de placer ' ...' dans le fichier jboss.xml non plus (sauf si vous essayez de surcharger le contenu du fichier ejb-jar fichier .xml). –

Répondre

0

Il semble que les versions plus récentes de JBoss/WildFly ne traitent pas très bien les anciens descripteurs de déploiement.

Si vous mettez à jour le schéma ejb-jar.xml de:

<ejb-jar xmlns="http://java.sun.com/xml/ns/j2ee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
     http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd" 
     version="2.1"> 

au moins:

<ejb-jar 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/ejb-jar_3_0.xsd" 
     version="3.0"> 

alors il devrait fonctionner comme prévu.

Vous pouvez trouver un exemple de travail sur GitHub à javaee14-ejb-demo

+0

Mes excuses, vous avez mis tellement de temps à tester tous ces scénarios. Je les ai essayés mais j'ai rencontré beaucoup de problèmes après avoir passé de 2_0.dtd à 3_0.xsd, et en corrigeant 1 mène à un autre donc je dois bouger avec la solution précédente pour le moment. La cible finale est Wildfly 10.0 et je suis certain que je vais y retourner à nouveau. C'est à ce moment-là que je jouerai avec. Encore une fois, j'apprécie vraiment votre temps, Steve. – user3758745

0

Obtenez le EJB dans le contexte (dans ce cas, en utilisant le nom de la classe):

public static <T> T getInstance(final Class<T> type) { 
    T result = null; 
    try { 
     InitialContext ctx = new InitialContext(); 
     BeanManager manager = (BeanManager) ctx.lookup("java:comp/BeanManager"); 
     Set<Bean<?>> beans = manager.getBeans(type); 
     Bean<T> bean = (Bean<T>) manager.resolve(beans); 
     if (bean != null) { 
      CreationalContext<T> context = manager.createCreationalContext(bean); 
      if (context != null) { 
       result = (T) manager.getReference(bean, type, context); 
      } 
     } 
    } catch (NamingException e) { 
     throw new RuntimeException(e); 
    } 
    return result; 
} 
+0

J'ai ajouté le 'cdi-api-1.2.jar' et essayez votre extrait de toute façon, mais' ctx.lookup ("java: comp/BeanManager") renvoie null'. Ai-je besoin de configurer la configuration dans le fichier XML pour le BeanManager? Si ce BeanManager peut en quelque sorte obtenir l'EJB, il doit faire la même recherche en arrière-plan, n'est-ce pas? alors dans ce cas, ne serait-ce pas que ma chaîne de recherche est incorrecte? – user3758745