问题: 当我注入一个带有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=".."))
答案 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=".."))
还有
mappedName
如何使用它们,您可以from the java docs about EJB