Javax.naming.NameNotFoundException

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

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

Спасибо

Ответы

Ответ 1

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

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

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

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

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

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

  • в ejb-jar.xml (!) имеется дополнительный символ (
<enterprise-beans>] < - ЗДЕСЬ) пробел отсутствует после 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 [email protected]{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/
21:48:06,805 INFO  [ProxyFactory] Bound EJB Home 'greetBean' to jndi 'greetJndi'

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

Ответ 2

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

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

/com/mypackage/MyEJB.class /com/mypackage/MyEJBInterface.class /com/mypackage/etc... и т.д. java-классы /META -INF/ejb-jar.xml /META -INF/jboss.xml

JAR файл более или менее ZIP файл с расширением файла, измененным с ZIP на JAR.

BTW. Если вы используете 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".