【问题标题】:How can an injected superclass Bean get the wrong instance ( subclass Bean instance) injected?注入的超类 Bean 如何获得注入的错误实例(子类 Bean 实例)?
【发布时间】:2017-09-05 07:17:42
【问题描述】:

问题: 在注入带有 2 个子类的 Bean(在过滤器中)时,我遇到了一些意外行为,这些子类是我在其他两个类(Servlet)中注入的。现在注入的超类可以在运行时持有对子类实例的引用(随着每次容器重启而改变)。

我一定犯了一个严重的错误,但我无法弄清楚到底是什么。

其他信息:

我使用 Java EE6

类结构:

在过滤器中,我将包含随机实例的超类注入其中一个子类或超类:

@EJB
private ClientLogger clientLogger;

超类是这样开始的:

@Stateless
@LocalBean
public class ClientLogger implements HcpEntityBeanLogger<Client> {

private Client client;

public ClientLogger(){
}

....

}

我将这个子类 bean 注入到我的一个 Servlet 中:

@Stateless
@LocalBean
public class AdminClientLogger extends ClientLogger {

public AdminClientLogger(){
}
...
}

解决方案尝试:

据我所知,最后注入的子类将是 clientLogger 引用的实例,但是为什么,为什么我不能有 3 个不同的实例并在这里使用继承?

编辑: 当注入多个实现相同接口的查询 bean 时,我再次遇到了这个问题,它们都将持有对同一个实例的引用。

解决方案是添加 beanName wenn 注入 EJB 接口

@EJB(beanName="name of your bean class or name specified in @Stateless(name=".."))

【问题讨论】:

    标签: java inheritance ejb javabeans code-injection


    【解决方案1】:

    您可以在@EJB 注释上使用查找属性并获得所需的子类注入。例如。

         @EJB(lookup="java:global/rest/AdminClientLogger")
          private ClientLogger clientLogger;
    

    显然,您必须更改上面示例中的 JNDI 查找路径。

    【讨论】:

      【解决方案2】:

      所以当你忘记引用具体的子类时,基本上就会发生这种情况。然后容器显然只会注入其中一个具体类的相同实例;

      有多种方法可以引用具体类:

      查找(来自@NiranjanBhat 的示例)

       @EJB(lookup="java:global/rest/AdminClientLogger")
        private ClientLogger clientLogger;
      

      豆名

      @EJB(beanName="name of your bean class or name specified in @Stateless(name=".."))
      

      还有

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-10
        • 2013-03-05
        • 2020-05-05
        • 2016-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多