System.Random r = new System.Random();
double rnd( double a, double b )
{
return a + r.NextDouble()*(b-a);
}
Невозможно выполнить JNDI-поиск bean-компонента из POJO, если этот POJO не вызывается (прямо или косвенно) из управляемого класса (например, сеансового bean-компонента). Другими словами, первый пример не будет работать, а второй будет (при условии, что MyPOJO - это класс, который пытается выполнить поиск JNDI):
1) UnmanagedClass1 -> UnmanagedClass2 -> UnmanagedClass3 -> MyPOJO
2) ManagedClass -> UnmanagedClass2 -> UnmanagedClass3 -> MyPOJO
Вы всегда можете выгрузить в 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() + ")");
}
}
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 Portability Issue должно помочь вы.
Я работал над 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