Введите 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 6

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 работал для меня, но будьте предельно осторожны с этим. Разделение загрузчиков классов не было введено без причины, так что по-видимому, впереди нас ждут новые проблемы...