【问题标题】:How to define an EJB as default implementation when using inheritance?使用继承时如何将 EJB 定义为默认实现?
【发布时间】:2014-12-15 17:15:28
【问题描述】:

我有以下情况:

@Stateless
public class ProjectManager{
    ...
}

@Stateless
public class ProjectManagerForLargeProjects extends ProjectManager{
    ...
}

所以,当我尝试注入第二个经理时,这工作正常

@Inject
private ProjectManagerForLargeProjects pMFLP;    // no problems, as expected

但是当我尝试注入基础 ProjectManager 时,容器不知道选择哪个实现。

@Inject
private ProjectManager pM;   // causes exception: WELD-001409 Ambiguous dependencies for type [ProjectManager] with qualifiers [@Default] at injection point ...

我知道我可以使用@Named 来指定实现,但我只想说 ProjectManager 是 ProjectManager 的默认值。 没有更简单的方法吗?


解决方案:我使用了@EJB 而不是@Inject,一切正常,但为什么呢?

【问题讨论】:

  • 使用单独的接口。顺便说一句,我认为您遇到的问题是代码异味的强烈迹象。
  • 嗯,我们正在使用一个 jee api,它提供了一个具有一些功能的无状态 bean,我们想添加一些功能......在我看来是经典继承,我不会在 JEE 中这样做吗?
  • 如果组合不是您的选择,最好为这里的两个用例使用两个单独的接口(或通过限定符明确区分)。

标签: jakarta-ee ejb cdi ejb-3.1 inject


【解决方案1】:

@EJB 在这里为您工作而@Inject 不适合您的原因是每个注释如何查找依赖项的工件。 EJB 使用 bean 名称进行解析,而 Inject 使用类型层次结构。在这种特定情况下,如果不使用限定符,Inject 将无法为您工作。

【讨论】:

    猜你喜欢
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    相关资源
    最近更新 更多