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

时间:2017-09-05 07:17:42

标签: java inheritance ejb javabeans code-injection

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

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

其他信息:

我使用Java EE6

班级结构:

在过滤器中我注入了一个超类,它将一个随机实例保存到一个子类或超类中:

@EJB
private ClientLogger clientLogger;

超级班是这样开始的:

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

private Client client;

public ClientLogger(){
}

....

}

我在我的一个Servlet中注入了这个子类bean:

@Stateless
@LocalBean
public class AdminClientLogger extends ClientLogger {

public AdminClientLogger(){
}
...
}

解决方案尝试:

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

修改 当我注入多个查询bean时,我再次遇到了这个问题,所有查询bean都实现了相同的接口,所有这些查询都会保存对同一个实例的引用。

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

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

查找(来自@NiranjanBhat的例子)

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

beanName

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

还有