web-dev-qa-db-fra.com

javax.naming.NameNotFoundException

J'utilise un exemple d'ejb utilisant JBoss5 Container. J'utilise un exemple d'ici (première partie) .
Dans l'exemple, j'ai déployé le bean dans JBoss et une application dans Tomcat (pour accéder au bean depuis JBoss). Je reçois l'erreur sur l'écran du serveur Tomcat
javax.naming.NameNotFoundException :reetJndi non lié

(GreetJndi est le nom jndi dans le fichier jboss.xml) Existe-t-il une structure de répertoires spécifique à déployer dans JBoss?

Merci

14
sjain

J'obtiens l'erreur (...) javax.naming.NameNotFoundException :reetJndi non lié

Cela signifie que rien n'est lié au nom jndi greetJndi, très probablement en raison d'un problème de déploiement étant donné qualité incroyablement faible de ce tutoriel (consultez les journaux du serveur). Je reviendrai là-dessus.

Existe-t-il une structure de répertoires spécifique à déployer dans JBoss?

La structure interne du ejb-jar est censé être comme ça (en utilisant les conventions de nommage pauvres et le package par défaut comme dans le lien mentionné):

. 
 ├── salueBean.Java 
 ├── salueHome.Java 
 ├── salueRemote.Java 
 └── META-INF 
 ├── ejb-jar.xml 
 └── jboss.xml 

Mais comme déjà mentionné, ce tutoriel est plein d'erreurs:

  • il y a un caractère supplémentaire (<enterprise-beans>] <- ICI) dans le ejb-jar.xml (!)
  • un espace manque après PUBLIC dans le ejb-jar.xml et jboss.xml (!!)
  • les jboss.xml est incorrect, il doit contenir un élément session au lieu de entity (!!!)

Voici une version "fixe" du ejb-jar.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://Java.Sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar>
  <enterprise-beans>
    <session>
      <ejb-name>greetBean</ejb-name>
      <home>greetHome</home>
      <remote>greetRemote</remote>
      <ejb-class>greetBean</ejb-class>
      <session-type>Stateless</session-type>
      <transaction-type>Container</transaction-type>
    </session>
  </enterprise-beans>
</ejb-jar>

Et du jboss.xml:

<?xml version="1.0"?>
<!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 3.2//EN" "http://www.jboss.org/j2ee/dtd/jboss_3_2.dtd">
<jboss>
  <enterprise-beans>
    <session>
      <ejb-name>greetBean</ejb-name>
      <jndi-name>greetJndi</jndi-name>
    </session>
  </enterprise-beans>
</jboss>

Après avoir effectué ces modifications et reconditionné le pot ejb, j'ai pu le déployer avec succès:

 21: 48: 06,512 INFO [Ejb3DependenciesDeployer] Déploiement rencontré AbstractVFSDeploymentContext @ 5060868 {vfszip: /home/Pascal/opt/jboss-5.1.0.GA/server/default/deploy/greet.jar /} 
 21: 48: 06,534 INFO [EjbDeployer] installation du bean: ejb/#reetBean, uid19981448 
 21: 48: 06,534 INFO [EjbDeployer] avec dépendances: 
 21: 48: 06,534 INFO [ EjbDeployer] et fournitures: 
 21: 48: 06,534 INFO [EjbDeployer] jndi :reetJndi 
 21: 48: 06,624 INFO [EjbModule] Déploiement de GreetBean 
 21: 48: 06,661 WARN [ EjbModule] EJB configuré pour contourner la sécurité. Veuillez vérifier si cela est prévu. Bean = accueillirBean Deployment = vfszip: /home/Pascal/opt/jboss-5.1.0.GA/server/default/deploy/greet.jar /
21: 48: 06,805 INFO [ProxyFactory] Bound EJB Home 'salueBean' à jndi 'salueJndi'

Ce tutoriel a besoin d'une amélioration significative; Je vous conseillerais de rester loin de roseindia.net.

25
Pascal Thivent

L'erreur signifie que vous essayez de rechercher le nom JNDI, qui n'est attaché à aucun composant EJB - le composant portant ce nom n'existe pas.

En ce qui concerne la structure dir: vous devez créer un fichier JAR avec des composants EJB. Si je comprends bien, vous voulez jouer avec les composants EJB 2.X (au moins l'exemple lié le suggère), la structure du fichier JAR devrait donc être:

/com/mypackage/MyEJB.class /com/mypackage/MyEJBInterface.class/com/mypackage/etc ... etc ... Java classes /META-INF/ejb-jar.xml /META-INF/jboss.xml

Le fichier JAR est plus ou moins un fichier Zip dont l'extension est passée de Zip à JAR.

BTW. Si vous utilisez JBoss 5, vous pouvez travailler avec EJB 3.0, qui sont beaucoup plus faciles à configurer. Le composant le plus simple est

@Stateless(mappedName="MyComponentName")
@Remote(MyEJBInterface.class)
public class MyEJB implements MyEJBInterface{
   public void bussinesMethod(){

   }
}

Aucun ejb-jar.xml, jboss.xml n'est nécessaire, juste EJB JAR avec les classes compilées MyEJB et MyEJBInterface.

Maintenant, dans votre code client, vous devez rechercher "MyComponentName".

4
Piotr Kochański