无状态 EJB 实现接口注入失败

Stateless EJB implements interface injection failed

野飞 8.2.0

我有一个 Stateless EJB 和一个接口。

@Local
@Stateless
public class Bean implements IBean{
...
}

@Local
public interface IBean {
...
}

但是我得到一个焊接错误。如果 Bean 没有实现接口,则没有错误。根据 https://blogs.oracle.com/arungupta/entry/what_s_new_in_ejb应该没有错误。

错误:

WELD-001408: Unsatisfied dependencies for type Bean with qualifiers @Default
  at injection point [BackedAnnotatedField] @Inject private mypackage.anotherBean.bean

更新: 我已经用 Local 尝试了所有可能的组合,但它没有帮助。仅当接口被删除时才不会出现错误。

@Stateless
public class Bean implements IBean{
...
}

@Local
public interface IBean {
...
}

//*****************************
@Stateless
public class Bean implements IBean{
...
}

public interface IBean {
...
}
//************************************
@Local
@Stateless
public class Bean implements IBean{
...
}

public interface IBean {
...
}

您需要从 Bean 中删除 @Local

@Stateless
public class Bean implements IBean{
...
}

因为你定义了2个可能,Local WELD不知道该用哪一个。

oracle 文档也通过 @Remote 接口显示了这一点:

@Remote
public interface Foo { . . . }

@Stateless
public class Bean implements Foo, Bar {
    . . .
}

当您想通过 EJB(使用 @EJB)或 CDI(使用 @Inject)容器注入 bean 时,您可以声明一个具有接口类型的变量。已声明接口的具体实现由容器在应用程序部署期间找到。在您的示例中,问题不在于注释,而在于被注入的声明类型(Bean 而不是 IBean)。