使用@Inject将无状态EJB注入CDI Weld ManagedBean(jboss 6 AS上的JSF 1.2 EJB应用程序)

ich*_*rin 6 dependency-injection cdi ejb-3.1 jboss-weld

目前我正在尝试将无状态EJB注入到Jboss 6 AS Final上的CDI管理控制器中.控制器在上下文中管理,可从JSF页面访问.如果我注入无状态bean @EJB正在工作.如果我注入无状态EJB,@Inject我会得到以下异常:

我的控制器:

@Named("TestController")
public class TestController {   
    @Inject
    private TestManagerLocal myTestManager;
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我的无状态豆:

@SuppressWarnings("unchecked")
@Stateless
public class TestManagerBean implements TestManagerLocal {

    @PersistenceContext
    private EntityManager em;
        ...
}
Run Code Online (Sandbox Code Playgroud)

Bean的接口使用@Local注释.

如果我尝试调用myTestManager,我会得到以下异常:

WELD-000079在JNDI中找不到EJB:class de.crud.org $ jboss $ weld $ bean-jboss $ classloader:id ="vfs:$$$ usr $ local $ jboss $ server $ default $ deploy $ test $耳朵"-SessionBean-TestManagerBean _ $$ _ WeldProxy

多谢.

Arj*_*jms 8

对于那些没有奢侈品来改变战争的人,我发现了以下解决方法:

  • 在战争中创建一个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
}
Run Code Online (Sandbox Code Playgroud)

现在可以在EAR中的任何位置注入EJB:

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

}
Run Code Online (Sandbox Code Playgroud)

EJBBean是一个简单的标准限定符注释.为了完整起见,这里是:

@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface EJBBean {

}
Run Code Online (Sandbox Code Playgroud)


ich*_*rin 2

问题是,我构建并部署了我的应用程序作为耳朵。当我将应用程序部署为战争(包括所有 EJB)时,Weld 正在工作。