Поиск JNDI EJB3 в файле EAR на Glassfish - PullRequest
6 голосов
/ 06 октября 2009

У меня есть файл EAR с кучей JAR-файлов, и один из этих JAR-файлов содержит локальные компоненты сеанса (EJB3). Мне нужно выполнить JNDI-поиск этих Сессионных Бинов из неуправляемого POJO, также содержащегося в EAR (и в этом случае в том же JAR, что и EJB). Я пытался следовать FAQ по Glassfish EJB , но я продолжаю получать исключение javax.naming.NameNotFoundException, независимо от того, что я пытаюсь.

Я не уверен в нескольких вещах. Где я должен положить свой ejb-jar.xml (я пробовал EARs META-INF, а также JARs META-INF)? Нужен ли мне файл sun-ejb-jar.xml? Что такое ejb-ссылка, что она делает? Что я могу делать не так (моя конфигурация почти идентична конфигурации, указанной в FAQ для локальных поисков)?

Я перечисляю некоторые конфигурации, которые я пробовал, и результат ниже:

<enterprise-beans>
  <session>
    <ejb-name>ITestBean</ejb-name>
    <ejb-class>com.test.TestBean</ejb-class>
    <ejb-local-ref>
      <ejb-ref-name>ITestBean</ejb-ref-name>
      <local>com.test.ITestBean</local>
    </ejb-local-ref>
  </session>
 </enterprise-beans>

Приложение развертывается, но поиск JNDI возвращает ноль.

<enterprise-beans>
  <session>
    <ejb-name>ITestBean</ejb-name>
    <ejb-class>com.test.TestBean</ejb-class>
    <ejb-local-ref>
      <ejb-ref-name>ITestBean</ejb-ref-name>
      <local>com.test.ITestBean</local>
      <ejb-link>ITestBean</ejb-link>
    </ejb-local-ref>
  </session>
 </enterprise-beans>

Приложение не разворачивается: невозможно определить локальный бизнес по сравнению с удаленным бизнес-назначением для EJB 3.0 ref Unresolved Ejb-Ref ITestBean@jndi.

<enterprise-beans>
  <session>
    <ejb-name>ITestBean</ejb-name>
    <ejb-class>com.test.TestBean</ejb-class>
    <ejb-local-ref>
      <ejb-ref-name>ITestBean</ejb-ref-name>
      <local>com.test.ITestBean</local>
      <ejb-link>MyJar.jar#ITestBean</ejb-link>
    </ejb-local-ref>
  </session>
 </enterprise-beans>

Приложение не развернуто: ошибка: не решена: MyJar.jar # ITestBean.

<enterprise-beans>
  <session>
    <ejb-name>ITestBean</ejb-name>
    <local>com.test.ITestBean</local>
    <ejb-local-ref>
      <ejb-ref-name>ITestBean</ejb-ref-name>
    </ejb-local-ref>
  </session>
 </enterprise-beans>

Ошибка обработки EjbDescriptor

Ответы [ 5 ]

9 голосов
/ 07 октября 2009

Вы также всегда можете сбросить на System.out или в журнале все имена в InitialContext.

//Get all the names in the initial context
NamingEnumeration children = initialContext.list("");

while(children.hasMore()) {
    NameClassPair ncPair = (NameClassPair)children.next();
    System.out.print(ncPair.getName() + " (type ");
    System.out.println(ncPair.getClassName() + ")");
  }
}
2 голосов
/ 06 октября 2009

Я думаю, что сообщение о блоге EJB 3 должно помочь вам.

2 голосов
/ 06 октября 2009

ejb-jar.xml для вашего файла ejb идет в META-INF (из EJB-Jar, а не из уха). Ссылки EJB в дескрипторе развертывания выглядят примерно так:

<ejb-local-ref>
    <ejb-ref-name>EJBName</ejb-ref-name>
    <ejb-ref-type>Session</ejb-ref-type>
    <local>classname</local>
    <ejb-link>JARName.jar#EJBName</ejb-link>
</ejb-local-ref>

Код поиска выглядит примерно так:

Context c = new InitialContext();
return (EJBLocalInterface) c.lookup("java:comp/env/EJBName");

Я не думаю, что вам понадобится дескриптор развертывания для конкретного контейнера (sun-ejb-jar.xml) для этого типа поиска.

0 голосов
/ 26 июня 2010

Я работаю над Glassfish v2, и при вызове JSNI из EJB3 мне нужен только ejb-jar.xml, а не sun-ejb-jar.xml

<ejb-jar xmlns = "http://java.sun.com/xml/ns/javaee" 
     version = "3.0" 
     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">

         <enterprise-beans>

             <session>
                 <ejb-name>TestBean1</ejb-name>
                 <ejb-local-ref>
                    <ejb-ref-name>ejb/TestLocal</ejb-ref-name>
                    <ejb-ref-type>Session</ejb-ref-type>
                    <local>com.clients.TestLocal</local>
                    <mapped-name>ejb/TestLocal</mapped-name>
                </ejb-local-ref>
                 <ejb-local-ref>
                    <ejb-ref-name>ejb/Test2Local</ejb-ref-name>
                    <ejb-ref-type>Session</ejb-ref-type>
                    <local>com.clients.Test2Local</local>
                    <mapped-name>ejb/Test2Local</mapped-name>
                </ejb-local-ref>
              <session>
        <enterprise-beans>

@Stateless(mappedName="ejb/TestLocal")
public class TestBean1 implements TestLocal

@Stateless(mappedName="ejb/Test2Local")
public class TestBean2 implements Test2Local

Вызов сервисного локатора внутри TestBean1 как

ic.lookup("java:comp/env/ejb/Test2Local");

вернет Test2Bean

0 голосов
/ 02 ноября 2009

Невозможно выполнить JNDI-поиск компонента из POJO, если только этот POJO не вызывается (прямо или косвенно) из управляемого класса (такого как сессионный компонент). Другими словами, первый пример не будет работать, в то время как второй будет работать (при условии, что MyPOJO - это класс, который пытается выполнить поиск JNDI):

1) UnmanagedClass1 -> UnmanagedClass2 -> UnmanagedClass3 -> MyPOJO
2) ManagedClass -> UnmanagedClass2 -> UnmanagedClass3 -> MyPOJO

...