Классы ссылочного проекта EJB, не найденные в (ссылочном) веб-проекте
Я изучаю J2EE и EJB и столкнулся со странной проблемой. Это моя настройка проекта:
Я использую Glassfish 3.1 и Eclipse 3.7. У меня есть два проекта в Eclipse:- проект, совместимый с EJB 3.0,
myEjbProject
- Динамический Веб-Проект,
myWebProject
Я впрыскиваю EJB-сеансовый Боб mySessionBeanPackage.mySessionBean
из myEjbProject
в сервлет myServletPackage.myServlet
в myWebProject
, а затем (в сервлете) вызываю простой метод, определенный в сеансовом Бобе.
Я предоставил myWebProject
со ссылкой на myEjbProject
(с помощью диалогового окна Свойства - > ссылки на проект). Однако по какой-то причине сервер не может найти бин сеанса. Точная ошибка, которую я получаю:
Серьезный: класс [ LmySessionBeanPackage/mySessionBean] не найден. Ошибка при загрузке [класс myServletPackage.myServlet]
Обратите внимание, что как проект EJB, так и веб-проект были опубликованы на сервере, и я дважды проверил, что файл класса сгенерированный для боба, на самом деле, присутствует на сервере (поэтому я не могу придумать причину, по которой сервер не может их найти).
Может ли кто-нибудь сказать мне, что я делаю не так?Я тоже пробовал
-
Добавление папки классов
myEjbProject
явно в список Java Build Path -> LibrariesmyWebProject
. Это в дополнение к ссылке на проект (хотя я думаю, что добавление ссылки на проект должно было быть достаточным в первую очередь). В любом случае, это не имеет значения. (то же сообщение об ошибке, что и раньше). -
Создание файла JAR из
myEjbProject
с помощью опции Export - > EJB Jar File (я не хочу сейчас писать сценарий Ant). Затем я поместил этот JAR в раздел Java Build Path - > LibrariesmyWebProject
. Этот подход также не решает проблему (то же сообщение об ошибке, что и раньше). -
Изменение Боба сеанса, чтобы иметь
- нет интерфейса
- локальный интерфейс
- удаленный интерфейс
И соответствующим образом модифицирует инъекцию. Например, для боба с только локальным интерфейсом я использовал:
@EJB mySessionBeanPackage.mySessionBeanLocal myBean
-
Полностью покончить с
myEjbProject
и добавить сеансовый боб вmyWebProject
КакmyServletPackage.mySessionBean
(тот же пакет, что и сервлет). В этом случае я могу успешно ввести сеансовый боб в сервлет, используя@EJB mySessionBeanPackage.mySessionBean myBean
-
Полностью покончить с
myEjbProject
и добавить сеансовый боб вmyWebProject
какmySessionBeanPackage.mySessionBean
(новый пакет). В этом случае я также могу успешно ввести сеансовый боб в сервлет, используя@EJB mySessionBeanPackage.mySessionBean myBean
1 ответ:
Я бы рекомендовал взглянуть на фактический EAR, который Eclipse упаковывает и развертывает на сервере. Вы можете сделать это, экспортировав проект EAR (щелкните правой кнопкой мыши на Ear project -> export -> Java EE -> EAR file)
Я думаю, что вам не хватает шага, чтобы добавить проект EJB в файл манифеста веб-проекта. Но на всякий случай, если вы пропустите еще несколько шагов, я бы проверил следующее:
- EJB и веб-проекты являются модулями проекта EAR. Щелкните правой кнопкой мыши проект уха - > свойства - > сборка развертывания - > Добавить - > проект - > выберите EJB и веб-проект. Если вы экспортируете свой проект EAR сейчас, вы заметите, что EJB и веб-проект упакованы вместе с EAR.
- Добавьте проект EJB в манифест веб-проекта. Щелкните правой кнопкой мыши веб-проект - > свойства - > сборка развертывания - > записи Манифеста - > Добавить - > выберите проект EJB. Вы можете открыть манифест.Файл MF и смотрите, что он теперь включает в себя проект EJB.
Также мне нравится добавлять EJB проект в путь сборки веб-проекта только так, чтобы он был включен в путь к классу WEB: щелкните правой кнопкой мыши веб-проект - > свойства - > путь сборки Java - > проекты - > Добавить - > выберите EJB.