Поиск JNDI EJB3 внутри файла уха на Glassfish

у меня есть файл уха с кучей банок в нем, и одна из этих банок содержит локальные сеансовые бобы (EJB3). Мне нужно выполнить поиск JNDI этих сеансовых бобов из неуправляемого POJO, также содержащегося в ухе (и в этом случае в той же банке, что и EJBs). Я попытался следовать сервер приложений GlassFish и EJB часто задаваемые вопросы, но я продолжаю получать javax.называющий.NameNotFoundException независимо от того, что я пытаюсь.

Я не уверен в нескольких вещах. Куда мне положить свои и EJB-банку.xml (я пробовал уши META-INF, а также банки META-INF)? Мне нужен sun-ejb-jar.в XML? Что такое ejb-link, что он делает? Что я могу сделать неправильно (моя конфигурация почти идентична той, которая приведена в 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 возвращает null.

<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 ответов


вы всегда можете свалить на систему.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() + ")");
  }
}

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) для этого типа поиска.


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


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

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


Я работаю над 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