EJB3 bean JNDI lookup в Websphere 7 - PullRequest
       61

EJB3 bean JNDI lookup в Websphere 7

2 голосов
/ 21 августа 2010

Я создал EAR с веб-проектом, проектом ejb3 и клиентом ejb. Я могу вызывать методы bean через инъекцию в сервлете. Я планирую использовать ServiceDelegate, который является pojo для обработки вызова bean-компонента. Поэтому я вызову делегата из моего сервлета, а делегат вызовет соответствующие bean-компоненты и их методы.

Но я не могу получить ссылки на bean-компоненты в классе делегата, который находится в веб-проекте. Аннотация @EJB вернула пустую ссылку. Поэтому я попытался найти JNDI с java: comp / env / EARname / BeanName . Но я всегда получаю исключения из имен.

Имя comp / env / EARname не найдено в контексте "java:".

Пожалуйста, предложите мне правильный способ вызова bean-компонентов ejb3 через JNDI на сервере Websphere 7.

1 Ответ

2 голосов
/ 21 августа 2010

Внедрение зависимостей в Java EE 5 и 6, работает только для управляемых классов.В контейнере сервлетов это поддерживается в нескольких типах классов, и не во всех POJO (к сожалению).

Servlet Spec 2.5 проливает свет на классы, для которых контейнер должен внедрять зависимости, если они присутствуют:


Тип компонента : Сервлеты

Классы, реализующие следующие интерфейсы

  • javax.servlet.Servlet

Тип компонента : фильтры

Классы, реализующие следующие интерфейсы :

  • javax.servlet.Filter

Тип компонента : Слушатели

Классы, реализующие следующие интерфейсы :

  • javax.servlet.ServletContextListener
  • javax.servlet.ServletContextAttributeListener
  • javax.servlet.ServletRequestListener
  • javax.servlet.ServletRequestAttributeListener
  • javax.servlet.http.HttpSessionListener
  • javax.servlet.htterH

    Поэтому, если вам нужно разрешитьВ случае поиска зависимостей вы можете использовать одну из следующих стратегий:

    • Вставить зависимость в управляемый класс и передать ее в ServiceDelegate.ИМХО это запах проекта.
    • Выполните поиск JNDI с использованием InitialContext, но вы должны знать о привязках JNDI, сгенерированных для развернутых EJB-компонентов.Похоже, что это ошибка, поскольку имя JNDI может быть неправильным - спецификация Java EE не стандартизировала имена JNDI, которые назначены развернутым EJB-компонентам.Другими словами, учитывая отсутствие переносимых имен JNDI, вы должны попытаться связать EJB с известным именем и выполнить его поиск.
    • Вам нужно будет убедиться, что объект сеанса EJB действительнопривязан к пространству имен java: comp / env.Это может быть не так.Для ясности, если контейнер не внедряет зависимость, необходимо объявить локальные ссылочные записи EJB в файле web.xml.Контейнер не будет автоматически вставлять EJB-объекты сеанса в пространство имен сервлета;это потребует, чтобы EJB был объявлен как ресурс в управляемом классе.Похоже, что это основной случай сбоя, хотя он указан последним.
...