java - 通过 Wildfly 应用程序中的接口(interface)注入(inject) EJB

标签 java ejb cdi

我使用的是 Wildfly 10.1.0 和 JavaEE 7

我有这个界面:

public interface TestEjb {
    String something();
}

以及实现它的这个 Ejb 类:

@LocalBean
@Stateless
public class TestEjbImpl implements TestEjb {

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

当我使用 @Path 注释的 jax-rs 类将其注入(inject)时

@Inject
private TestEjb testEjb;

它给出一个错误,指出“WELD-001408:带有限定符@Default的类型TestEjb的依赖关系不满足”

但是当我注入(inject)它时

@Inject
private TestEjbImpl testEjb;

效果很好。 令人惊讶的是,这两种方法在 jboss-eap-6.4 中都没有问题。但为什么呢?

最佳答案

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

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

最好的方法是注释 TestEjb@Local 的接口(interface)查看并删除 @LocalBean来自TestEjbImpl实现以使您的解决方案发挥作用。

界面

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

EJB

@Stateless
public class TestEjbImpl implements TestEjb {

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

注入(inject)时间

@EJB
private TestEjb testEjb;

我希望这会有所帮助。

Further reading ...

关于java - 通过 Wildfly 应用程序中的接口(interface)注入(inject) EJB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40650111/

相关文章:

java - 不调用抽象祖先的@PostConstruct

Java EE CDI 拦截器在 JAX-RS 资源类中不起作用

java - 使用 CDI/Weld JAX-RS/RESTEasy 找不到资源

java - 将数据文件的内容读入内存中适当的对象数组中

java - 在泛型类中实现泛型接口(interface)

java - 如何在骨架实现(即类)中实现一个接口(interface),该接口(interface)的两个实例可以相互依赖,而无需向下转型?

java - 在 WAR 文件 (JEE5) 中打包 1 个 WebService 和 2 个 MDB

java - EJB 注入(inject)错误

java - Intellij tomee 设置 tomee.serialization.class.whitelist

java - 代号一侧菜单在永久模式下缺少内容