Введите EJB без состояния с помощью @Inject в CDI Weld ManagedBean (приложение JSF 1.2 EJB на jboss 6 AS)
В настоящее время я пытаюсь ввести EJB без состояния в управляемый CDI контроллер на Jboss 6 как окончательный. Контроллер управляется в контексте, доступном со страниц JSF. Если я введу боб без состояния с @EJB
, он работает. Если я введу EJB без состояния с @Inject
, я получу следующее исключение:
Мой контроллер:
@Named("TestController")
public class TestController {
@Inject
private TestManagerLocal myTestManager;
...
}
}
Мой боб без гражданства:
@SuppressWarnings("unchecked")
@Stateless
public class TestManagerBean implements TestManagerLocal {
@PersistenceContext
private EntityManager em;
...
}
Интерфейс Боба снабжен аннотацией @Local.
Если я попытаюсь вызвать myTestManager, я получу следующее исключение:
WELD-000079 не смог найти EJB в JNDI: class de.crud.org$jboss$weld$bean-jboss$classloader:id="vfs:$$$usr$local$jboss$server$default$deploy$test$ear"-SessionBean-TestManagerBean_$$_WeldProxy
THX много.
3 ответа:
Для тех, кто не имеет роскоши менять ухо на войну, я нашел следующий обходной путь:
- создать EJB в войне
- введите этот EJB вместе с EJBs из модуля EJB
- добавить методы производителя CDI
- Квалифицируйте
@Inject
с помощью квалификатора для этих методов производителя:Код:
// This bean is defined in the WEB module @Stateless public class EJBFactory { @EJB protected UserDAO userDAO; // ~X other EJBs injected here @Produces @EJBBean public UserDAO getUserDAO() { return userDAO; } // ~X other producer methods here }
Теперь EJBs из любого места в ухе можно вводить с:
// This bean is also defined in the web module @RequestScoped public class MyBean { @Inject @EJBBean private UserDAO userDAO; // injection works public void test() { userDao.getByID(...); // works } }
EJBBean - это простая стандартная квалификационная аннотация. Для полноты, вот оно:
@Qualifier @Retention(RUNTIME) @Target({TYPE, METHOD, FIELD, PARAMETER}) public @interface EJBBean { }
Проблема заключалась в том, что я построил и развернул свое приложение в качестве уха. Сварка работает, когда я развертываю свое приложение как войну, включая все EJBs.
В настоящее время существуют различные проблемы, возникающие из-за того, что войны в Ear-развертываниях не используют один и тот же загрузчик классов. См. https://issues.jboss.org/browse/JBAS-8683 для продолжающегося обсуждения в JBoss-AS JIRA (и проголосовать: -))
Обновление я нашел эту информацию на Как отключить отдельные загрузчики классов, Вариант 1 работал для меня, но будьте предельно осторожны с этим. Разделение загрузчиков классов не было введено без причины, так что по-видимому, впереди нас ждут новые проблемы...