| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java EE (J2EE) и Spring > EJB3 Wrong target class |
| Автор: Alexis 10.2.2009, 10:54 | ||||||||
| Мучаю потихоньку EJB3. Чувствую, что ошибка совсем глупая, но все же разобраться самостоятельно не могу. Если слегка упростить мое творчество, то получается, что имеется класс модели User, есть Stateless бин с методом добавления пользователя:
И сервлет
Собираются два JAR: ejb, модель и war-файл с сервлетом. Пакуется EAR и деплоится на JBoss 5.0 GA. При вызове сервлета выкидывается ошибка:
и так далее в том же духе. Самое интересное, что так ругается он только на мою модель. Если, к примеру, передавать String с именем пользователя, а объект создавать в бине и сохранять, то все отлично работает. Чем ему не нравятся классы моей модели, когда их передают бинам, я ума ни приложу. |
| Автор: powerOn 10.2.2009, 12:43 |
| А что если интерфейс Users пометить как @Local ? |
| Автор: Alexis 11.2.2009, 10:05 | ||
Без изменений, ошибка та же. |
| Автор: chand0s 11.2.2009, 10:24 |
| 1) Насколько я помню EJB спеку - если пометок @Local, @Remote нет - интерфейс считается локальным. 2) Если один интерфейс загружен двумя класслоадерами - это два разных интерфейса По моему у вас здесь именно это и произошло - jboss грузит бин (и интерфейс Users) одним класслоадером, а tomcat - другим, поэтому у вас эти "имплементации" интерфейса несовместимы. Поковыряйтесь в доке jboss'а, поищите как можно заставить tomcat использовать класслоадер jboss-овского deployer'а |
| Автор: chand0s 19.2.2009, 15:41 | ||||
Вообще это не странно. Подумайте сами, что происходит внутри сервера: 1) Интерфейс локальный. JBoss делает так:
2) Интерфейс удаленный. Происходит примерно вот что:
|
| Автор: ivg 19.2.2009, 17:26 |
| Alexis, у вас классы модели находятся только в отдельном jar'е? В war'е их нету? Обычно и классы модели и Enterprise бины упаковываются в один jar. В манифесте war'а (/META-INF/MANIFEST.MF) прописывается ссылка на <ejb>.jar (строка Class-Path: <ejb>.jar) Ну и в application.xml ear'а должны быть определены оба модуля. <ejb>.jar - имя jar файла с классами модели и Enterprise бинами. Современные IDE делают это автоматом, либо при сборке проекта, либо при создании(настройке) проектов. Если вы выносите классы модели в отдельный jar, то соответствующие ссылки должны быть прописаны в манифестах и <ejb>.jar и war файлов. |
| Автор: Alexis 19.2.2009, 18:46 | ||
Действительно, установил в pom.xml зависимостям ejb и модели scope равным provided. Как результат, JAR файлы не копируются в создаваемый WAR-архив. Т. е. фактически получается следующая структура:
До этого EJB лежали в WAR-файле, что и вызавало проблему, которую подробно описал chand0s. chand0s, спасибо за терпение и подробное объяснение! ivg, спасибо за наводку на простой путь решения! Поставил плюсы. |