【问题标题】:How can I inject two EJBs of same type?如何注入两个相同类型的 EJB?
【发布时间】:2023-04-11 06:28:02
【问题描述】:

我正在尝试注入两个具有不同注释的相同类型的 EJB。 但是注入的实例是一样的。

@Path("/some")
public class SomeResource {

    @Inject
    @SomePostConstructionAnnotationForSomeService("this")
    private SomeService s1;

    @Inject
    @SomePostConstructionAnnotationForSomeService("that")
    private SomeService s2;
}

SomeService 类如下所示。

public SomeService {

    @PostConstruct
    private void constructed() {
        // find the annotation and do something else.
    }

    @Inject
    private InjectionPoint injectionPoint;
}

问题是只调用了s1,而s2等于s1。

【问题讨论】:

    标签: ejb cdi


    【解决方案1】:

    如果SomeService 是CDI bean 并且它的范围是@Dependent 或没有范围(这也意味着@Dependent 注入另一个bean 时),这将起作用。它有什么范围?如果 SomeService 是 EJB bean 而不是 CDI 这将不起作用。

    更新: 您可以将 SomeService 移至基类并通过扩展此类并注入这些 EJB 来创建两个不同的 EJB bean。

    【讨论】:

    • 哦,SomeService 是一个 EJB。
    • 您可以将SomeService 移动到一个基类,并通过扩展这个类并注入这些EJB 来创建两个不同的EJB bean。可能还需要一个接口 - 这应该被检查。
    • 您能否将最后一条评论移到答案中?这是一个很好的解决方案,但我花了一段时间才明白为什么答案被接受......谢谢
    • @A.Panzer 如果 ejb bean 是无状态 bean 并且还使用 CDI 注释 @Dependent 进行注释,它将起作用。
    • @maress 你确定吗?我已经检查过了 - 这不起作用(一个实例被注入两次)。这是没有意义的,因为通常无状态 bean 会被池化,并且在重用时不会被初始化。 OP 想要在注入前进行一些初始化。
    猜你喜欢
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多