Java 注入的超类Bean如何注入错误的实例(子类Bean实例)?

Java 注入的超类Bean如何注入错误的实例(子类Bean实例)?,java,inheritance,ejb,javabeans,code-injection,Java,Inheritance,Ejb,Javabeans,Code Injection,问题: 当我在另外两个类(servlet)中注入带有2个子类的Bean(在过滤器中)时,我出现了一些意想不到的行为。现在,注入的超类可以在运行时保存对子类实例的引用(随着每次容器重启而改变) 我一定犯了一个严重的错误,但我不太清楚到底是什么 其他信息: 我使用JavaEE6 班级结构: 在过滤器中,我将包含随机实例的超类注入子类或超类之一: @EJB private ClientLogger clientLogger; 超级课堂开始时是这样的: @Stateless @LocalBean pu

问题: 当我在另外两个类(servlet)中注入带有2个子类的Bean(在过滤器中)时,我出现了一些意想不到的行为。现在,注入的超类可以在运行时保存对子类实例的引用(随着每次容器重启而改变)

我一定犯了一个严重的错误,但我不太清楚到底是什么

其他信息:

我使用JavaEE6

班级结构:

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

@EJB
private ClientLogger clientLogger;
超级课堂开始时是这样的:

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

private Client client;

public ClientLogger(){
}

....

}
解决方案尝试:

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

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

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

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

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

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

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

因此,当您忘记引用具体的子类时,基本上会发生这种情况。然后容器显然只会注入一个具体类的相同实例

有许多方法可以引用混凝土类别:

查找(来自@NiranjanBhat的示例)

豆名

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

  • 名字

  • beanInterface

  • 地图名称

    如何使用它们,你可以采取

 @EJB(lookup="java:global/rest/AdminClientLogger")
  private ClientLogger clientLogger;
@EJB(beanName="name of your bean class or name specified in @Stateless(name=".."))