2009-03-17 3 views
1

Почему я получаю исключение NameNotFoundException при использовании context.lookup("java:comp/env/MyBean"), но не когда я использую context.lookup(MyBean.class.getName())?Почему я получаю NameNotFoundExcpetion при использовании context.lookup («java: comp/env/MyBean»)

Сообщения об ошибках «Объект не связан с java: comp/env/MyBean» Как связать имя и почему class.getName() все еще работает? Почему я должен использовать java: comp/env?

Я использую Netbeans 6.5, Glassfish 2.1.

ответ

2

java: comp/env префикс используется для ссылки на ресурс. Это абстракция между ресурсом, который вы просматриваете, и фактическим именем JNDI ресурса. Он позволяет вам изменять местоположение базового ресурса (то есть другого сервера и контекста), не влияя на ваш код поиска.

Я использовал его только в WAS, но идея состоит в том, что вы создаете ссылку на существующий ресурс (JMS, JDBC, EJB ...) для каждого модуля, которому необходимо получить доступ к ресурсу. Это часть вашей конфигурации развертывания.

Tutorial from Sun here и Glassfish example here.

+0

Спасибо. Если изменится сервер и контекст, не будет ли работать class.getName()? Я думаю, имя класса может измениться, и я мог бы затем сопоставить некоторый другой класс с моим кодом поиска, используя java: comp/env – blank

+0

Я могу только предположить, что имя JNDI в вашем случае соответствует вашему полному имени bean-компонента. Я никогда не видел этого раньше. Проблема заключается в том, что компонент не развернут локально, поэтому ваш исходный текст по умолчанию не сможет его найти. – Robin

+0

Если компонент развернут на другом сервере, JNDI для поиска будет иметь полную квалификацию, например «corbaname: iiop: someHost: 2809 # com/mycompany/accounting/MyBean». Использование ссылки изменит только дескриптор развертывания, и вам не нужно будет кодировать эту божественную строку. – Robin

0

Я не уверен, если это верно для Glassfish или нет, но в случае JBOSS, если вы включите DEBUG, вы можете заметить JNDI имя, которое будет использоваться.

Например, во время развертывания сессионного компонента под названием DemoBean, вы увидите следующий журнал в файле server.log: -

2009-07-24 09: 08: 18,747 DEBUG [org.jboss .ejb3.stateless.StatelessDelegateWrapper] Создание jboss.j2ee: jar = SessionBeanDemo.jar, name = DemoBean, service = EJB3 2009-07-24 09: 08: 18,747 DEBUG [org.jboss.ejb3.ProxyDeployer] нет объявленных удаленных привязок for: DemoBean 2009-07-24 09: 08: 18,747 DEBUG [org.jboss.ejb3.ProxyDeployer] есть удаленные интерфейсы для DemoBean 2009-07-24 09: 08: 18,747 DEBUG [org.jboss.ejb3.ProxyDeployer ] удаленное связывание по умолчанию имеет jndiName от DemoBean/remote

Затем в коде клиента вы можете посмотреть его, как это: -

 InitialContext ctx; 
     try { 
      ctx = new InitialContext(); 
      DemoBeanRemote demo = (DemoBeanRemote) ctx.lookup("DemoBean/remote"); 
      System.out.println(demo.sayHello()); 
     } catch (NamingException e) { 
      e.printStackTrace(); 
     }