Внедрить EJB без сохранения состояния с помощью @Inject в CDI Weld ManagedBean (EJB-приложение JSF 1.2 в jboss 6 AS) - PullRequest
6 голосов
/ 21 февраля 2011

В настоящее время я пытаюсь внедрить EJB без сохранения состояния в управляемый контроллер CDI в Jboss 6 AS Final. Контроллер управляется в контексте, доступном со страниц 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: класс de.crud.org $ JBoss $ приварку $ боба JBoss $ Загрузчик классов: ID = "VFS: $$$ USR $ местный $ JBoss $ сервер $ по умолчанию $ развернуть $ тест $ ухо" -SessionBean-TestManagerBean _ $$ _ WeldProxy

THX много.

Ответы [ 3 ]

8 голосов
/ 19 апреля 2011

Для тех, кто не может позволить себе сменить слух на войну, я нашел следующий обходной путь:

  • Создание EJB на войне
  • Внедрение этого EJB с помощьюEJB-компоненты из модуля 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
}

Теперь EJB из любой точки EAR можно вводить с помощью:

// 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 {

}
2 голосов
/ 19 апреля 2011

В настоящее время существуют различные проблемы, связанные с тем, что WAR-файлы в EAR-Deployments не используют один и тот же загрузчик классов. См. https://issues.jboss.org/browse/JBAS-8683 о продолжающейся дискуссии в JBoss-AS JIRA (и проголосуйте за это :-))

ОБНОВЛЕНИЕ Я нашел эту информацию на , как отключить отдельные загрузчики классов , вариант 1 работал для меня, но будьте предельно осторожны с этим. Разделение загрузчиков классов не было введено без всякой причины, так что, очевидно, на пути впереди новые проблемы ...

2 голосов
/ 23 февраля 2011

Проблема заключалась в том, что я построил и развернул свое приложение как ухо. Weld работает, когда я развертываю свое приложение как войну, включая все EJB.

...