javax.naming.NameNotFoundException - PullRequest
       57

javax.naming.NameNotFoundException

14 голосов
/ 12 октября 2010

Я запускаю пример ejb с использованием JBoss5 Container. Я использую пример отсюда (часть первая) .
В примере я развернул bean-компонент в JBoss и приложение в Tomcat (для доступа к bean-компоненту из JBoss). Я получаю сообщение об ошибке на экране сервера tomcat
javax.naming.NameNotFoundException: greetJndi не связан

(greetJndi - это имя jndi в файле jboss.xml) Существует ли какая-либо конкретная структура каталогов для развертывания в JBoss?

Спасибо

Ответы [ 2 ]

25 голосов
/ 16 октября 2010

Я получаю сообщение об ошибке (...) javax.naming.NameNotFoundException: greetJndi не связано

Это означает, что ничто не связано с именем jndi greetJndi, очень вероятно из-за проблемы развертывания, учитывая невероятно низкое качество этого руководства (проверьте журналы сервера). Я вернусь к этому.

Существует ли какая-либо конкретная структура каталогов для развертывания в JBoss?

Предполагается, что внутренняя структура ejb-jar будет выглядеть следующим образом (с использованием плохих соглашений об именах и пакета по умолчанию , как в указанной ссылке):

.
├── greetBean.java
├── greetHome.java
├── greetRemote.java
└── META-INF
    ├── ejb-jar.xml
    └── jboss.xml

Но, как уже упоминалось, этот урок полон ошибок:

  • есть дополнительный символ (<enterprise-beans>] <- ЗДЕСЬ) в <code>ejb-jar.xml (!)
  • пробел отсутствует после PUBLIC в ejb-jar.xml и jboss.xml (!!)
  • неправильный jboss.xml, он должен содержать элемент session вместо entity (!!!)

Вот «исправленная» версия 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>

И из 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>

После внесения этих изменений и переупаковки ejb-jar я смог успешно развернуть его:

21:48:06,512 INFO  [Ejb3DependenciesDeployer] Encountered deployment AbstractVFSDeploymentContext@5060868{vfszip:/home/pascal/opt/jboss-5.1.0.GA/server/default/deploy/greet.jar/}
21:48:06,534 INFO  [EjbDeployer] installing bean: ejb/#greetBean,uid19981448
21:48:06,534 INFO  [EjbDeployer]   with dependencies:
21:48:06,534 INFO  [EjbDeployer]   and supplies:
21:48:06,534 INFO  [EjbDeployer]    jndi:greetJndi
21:48:06,624 INFO  [EjbModule] Deploying greetBean
21:48:06,661 WARN  [EjbModule] EJB configured to bypass security. Please verify if this is intended. Bean=greetBean Deployment=vfszip:/home/pascal/opt/jboss-5.1.0.GA/server/default/deploy/greet.jar/
<b>21:48:06,805 INFO  [ProxyFactory] Bound EJB Home 'greetBean' to jndi 'greetJndi'</b>

Этот учебник нуждается в значительном улучшении; Я бы посоветовал держаться подальше от roseindia.net.

4 голосов
/ 13 октября 2010

Ошибка означает, что вы пытаетесь найти имя JNDI, которое не прикреплено ни к какому компоненту EJB - компонент с таким именем не существует.

Что касается структуры dir: вам нужно создать файл JAR с компонентами EJB. Как я понимаю, вы хотите поиграть с компонентами EJB 2.X (по крайней мере, из приведенного примера), поэтому структура файла JAR должна быть:

/ ком / MyPackage / MyEJB.class /com/mypackage/MyEJBInterface.class / com / mypackage / etc ... etc ... java классы /META-INF/ejb-jar.xml /META-INF/jboss.xml

Файл JAR представляет собой более или менее ZIP-файл с расширением файла, измененным с ZIP на JAR.

КСТАТИ. Если вы используете JBoss 5, вы можете работать с EJB 3.0, который намного проще в настройке. Самый простой компонент -

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

   }
}

Нет ejb-jar.xml, нужен jboss.xml, просто EJB JAR с скомпилированными классами MyEJB и MyEJBInterface.

Теперь в коде вашего клиента вам нужно найти «MyComponentName».

...