Классы ссылочного проекта EJB, не найденные в (ссылочном) веб-проекте


Я изучаю J2EE и EJB и столкнулся со странной проблемой. Это моя настройка проекта:

Я использую Glassfish 3.1 и Eclipse 3.7. У меня есть два проекта в Eclipse:
  1. проект, совместимый с EJB 3.0, myEjbProject
  2. Динамический Веб-Проект, myWebProject

Я впрыскиваю EJB-сеансовый Боб mySessionBeanPackage.mySessionBean из myEjbProject в сервлет myServletPackage.myServlet в myWebProject, а затем (в сервлете) вызываю простой метод, определенный в сеансовом Бобе.

Я предоставил myWebProject со ссылкой на myEjbProject (с помощью диалогового окна Свойства - > ссылки на проект). Однако по какой-то причине сервер не может найти бин сеанса. Точная ошибка, которую я получаю:

Серьезный: класс [ LmySessionBeanPackage/mySessionBean] не найден. Ошибка при загрузке [класс myServletPackage.myServlet]

Обратите внимание, что как проект EJB, так и веб-проект были опубликованы на сервере, и я дважды проверил, что файл класса сгенерированный для боба, на самом деле, присутствует на сервере (поэтому я не могу придумать причину, по которой сервер не может их найти).

Может ли кто-нибудь сказать мне, что я делаю не так?

Я тоже пробовал

  • Добавление папки классов myEjbProject явно в список Java Build Path -> Libraries myWebProject. Это в дополнение к ссылке на проект (хотя я думаю, что добавление ссылки на проект должно было быть достаточным в первую очередь). В любом случае, это не имеет значения. (то же сообщение об ошибке, что и раньше).

  • Создание файла JAR из myEjbProject с помощью опции Export - > EJB Jar File (я не хочу сейчас писать сценарий Ant). Затем я поместил этот JAR в раздел Java Build Path - > Libraries myWebProject. Этот подход также не решает проблему (то же сообщение об ошибке, что и раньше).

  • Изменение Боба сеанса, чтобы иметь

    • нет интерфейса
    • локальный интерфейс
    • удаленный интерфейс

    И соответствующим образом модифицирует инъекцию. Например, для боба с только локальным интерфейсом я использовал:

    @EJB mySessionBeanPackage.mySessionBeanLocal myBean

    Этот подход также не решил проблему (то же сообщение об ошибке, что и раньше).
  • Полностью покончить с myEjbProject и добавить сеансовый боб в myWebProject Как myServletPackage.mySessionBean (тот же пакет, что и сервлет). В этом случае я могу успешно ввести сеансовый боб в сервлет, используя

    @EJB mySessionBeanPackage.mySessionBean myBean

  • Полностью покончить с myEjbProject и добавить сеансовый боб в myWebProject как mySessionBeanPackage.mySessionBean (новый пакет). В этом случае я также могу успешно ввести сеансовый боб в сервлет, используя

    @EJB mySessionBeanPackage.mySessionBean myBean

1 5

1 ответ:

Я бы рекомендовал взглянуть на фактический EAR, который Eclipse упаковывает и развертывает на сервере. Вы можете сделать это, экспортировав проект EAR (щелкните правой кнопкой мыши на Ear project -> export -> Java EE -> EAR file)

Я думаю, что вам не хватает шага, чтобы добавить проект EJB в файл манифеста веб-проекта. Но на всякий случай, если вы пропустите еще несколько шагов, я бы проверил следующее:

  1. EJB и веб-проекты являются модулями проекта EAR. Щелкните правой кнопкой мыши проект уха - > свойства - > сборка развертывания - > Добавить - > проект - > выберите EJB и веб-проект. Если вы экспортируете свой проект EAR сейчас, вы заметите, что EJB и веб-проект упакованы вместе с EAR.
  2. Добавьте проект EJB в манифест веб-проекта. Щелкните правой кнопкой мыши веб-проект - > свойства - > сборка развертывания - > записи Манифеста - > Добавить - > выберите проект EJB. Вы можете открыть манифест.Файл MF и смотрите, что он теперь включает в себя проект EJB.

Также мне нравится добавлять EJB проект в путь сборки веб-проекта только так, чтобы он был включен в путь к классу WEB: щелкните правой кнопкой мыши веб-проект - > свойства - > путь сборки Java - > проекты - > Добавить - > выберите EJB.