Почему я получаю NameNotFoundExcpetion при использовании context.lookup(“java:comp/env/MyBean”)
Вопрос
Почему я получаю исключение NameNotFoundException при использовании context.lookup("java:comp/env/MyBean")
но не тогда, когда я использую context.lookup(MyBean.class.getName())
?
Сообщение об ошибке "Нет объекта, привязанного к java: comp / env / MyBean" Как мне привязать имя и почему class.getName()
все еще работаешь?Зачем мне использовать java: comp / env?
Я использую Netbeans 6.5, Glassfish 2.1.
Решение
В java:comp/env префикс используется для чего-то, называемого ссылкой на ресурс.Это абстракция между ресурсом, который вы ищете, и фактическим именем ресурса JNDI.Это позволяет вам изменить местоположение базового ресурса (т.е.другой сервер и контекст), не влияя на ваш код поиска.
Я использовал его только в WAS, но идея заключается в том, что вы создаете ссылку на существующий ресурс (JMS, JDBC, EJB ...) для каждого модуля, которому необходим доступ к ресурсу.Это часть вашей конфигурации развертывания.
Учебное пособие от Sun здесь и Пример стеклянной рыбы здесь.
Другие советы
Я не уверен, верно ли это для Glassfish или нет, но в случае JBOSS, если вы включите DEBUG, вы можете заметить имя jndi, которое будет использоваться.
Например, во время развертывания сеансового компонента с именем DemoBean вы увидите следующий журнал в файле server.log:-
2009-07-24 09:08:18,747 ОТЛАДКА [org.jboss.ejb3.без состояния.StatelessDelegateWrapper] Создание jboss.j2ee:jar=SessionBeanDemo.jar ,имя=DemoBean,сервис =EJB3 2009-07-24 09:08:18,747 ОТЛАДКА [org.jboss.ejb3.ProxyDeployer] нет объявленных удаленных привязок для :DemoBean 2009-07-24 09:08:18,747 ОТЛАДКА [org.jboss.ejb3.ProxyDeployer] для DemoBean есть удаленные интерфейсы 2009-07-24 09:08:18,747 ОТЛАДКА [org.jboss.ejb3.ProxyDeployer] удаленная привязка по умолчанию имеет jndiName Дембельский/удаленный
Затем в вашем клиентском коде вы можете посмотреть это следующим образом:-
InitialContext ctx;
try {
ctx = new InitialContext();
DemoBeanRemote demo = (DemoBeanRemote) ctx.lookup("DemoBean/remote");
System.out.println(demo.sayHello());
} catch (NamingException e) {
e.printStackTrace();
}