在 Wildfly 应用程序中通过接口注入 EJB

Injecting EJB via interface in Wildfly application

我正在使用 wildfly 10.1.0 和 JavaEE 7

我有这个界面:

public interface TestEjb {
    String something();
}

和这个 Ejb class 实现它:

@LocalBean
@Stateless
public class TestEjbImpl implements TestEjb {

    @Override
    public String something() {
        return "Hello world";
    }
}

当我使用

将它注入我的@Path 注释 jax-rs class 时
@Inject
private TestEjb testEjb;

它给出一个错误说 "WELD-001408: Unsatisfied dependencies for type TestEjb with qualifiers @Default"

但是当我像这样注入它时

@Inject
private TestEjbImpl testEjb;

它工作正常。 令人惊讶的是,这两种方式在 jboss-eap-6.4 中都没有问题。但是为什么?

首先,您将 CDI 注入与 EJB 注入混合在一起。注入 EJB 时,最好使用 @EJB(而不是 @Inject)。

@LocalBean 有一个无界面视图。因此,您有一个没有视图注释的接口和一个没有接口视图注释的 bean。 EJB 容器将其理解为无接口视图。

最好的方法是使用 @Local 视图注释 TestEjb 接口,并从 TestEjbImpl 实现中删除 @LocalBean 以使您的解决方案起作用。

界面

@Local
public interface TestEjb {
    String something();
}

EJB

@Stateless
public class TestEjbImpl implements TestEjb {

    @Override
    public String something() {
        return "Hello world";
    }
}

注射时间

@EJB
private TestEjb testEjb;

希望对您有所帮助。

Further reading...