注入的超类 Bean 如何注入错误的实例(子类 Bean 实例)?
How can an injected superclass Bean get the wrong instance ( subclass Bean instance) injected?
问题:
当我用 2 个 subclasses 注入 Bean(在过滤器中)时,我有一些意想不到的行为,我注入了另外两个 classes(Servlets)。现在注入的 superclass 可以在运行时保存对 subclass 实例的引用(随着每次容器重启而改变)。
我一定是犯了一个严重的错误,但我不太明白到底是什么。
附加信息:
我用JavaEE6
Class结构:
在过滤器中,我将保存随机实例的超级 class 注入子 class 之一或超级 class:
@EJB
private ClientLogger clientLogger;
超级class是这样开始的:
@Stateless
@LocalBean
public class ClientLogger implements HcpEntityBeanLogger<Client> {
private Client client;
public ClientLogger(){
}
....
}
我将这个子class bean 注入到我的一个 Servlet 中:
@Stateless
@LocalBean
public class AdminClientLogger extends ClientLogger {
public AdminClientLogger(){
}
...
}
解决方案尝试:
所以据我了解,最后注入的subclass将是clientLogger引用的实例,但是为什么,为什么我不能有3个不同的实例并在这里使用继承?
编辑:
我在注入多个实现相同接口的查询 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 查找路径。
所以当您忘记引用具体的子 class 时,基本上会发生这种情况。然后容器显然只会注入具体 classes;
之一的相同实例
有很多方法可以参考具体的class:
查找(来自@NiranjanBhat 的示例)
@EJB(lookup="java:global/rest/AdminClientLogger")
private ClientLogger clientLogger;
豆名
@EJB(beanName="name of your bean class or name specified in @Stateless(name=".."))
还有
姓名
beanInterface
mappedName
如何使用它们你可以from the java docs about EJB
问题: 当我用 2 个 subclasses 注入 Bean(在过滤器中)时,我有一些意想不到的行为,我注入了另外两个 classes(Servlets)。现在注入的 superclass 可以在运行时保存对 subclass 实例的引用(随着每次容器重启而改变)。
我一定是犯了一个严重的错误,但我不太明白到底是什么。
附加信息:
我用JavaEE6
Class结构:
在过滤器中,我将保存随机实例的超级 class 注入子 class 之一或超级 class:
@EJB
private ClientLogger clientLogger;
超级class是这样开始的:
@Stateless
@LocalBean
public class ClientLogger implements HcpEntityBeanLogger<Client> {
private Client client;
public ClientLogger(){
}
....
}
我将这个子class bean 注入到我的一个 Servlet 中:
@Stateless
@LocalBean
public class AdminClientLogger extends ClientLogger {
public AdminClientLogger(){
}
...
}
解决方案尝试:
所以据我了解,最后注入的subclass将是clientLogger引用的实例,但是为什么,为什么我不能有3个不同的实例并在这里使用继承?
编辑: 我在注入多个实现相同接口的查询 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 查找路径。
所以当您忘记引用具体的子 class 时,基本上会发生这种情况。然后容器显然只会注入具体 classes;
之一的相同实例有很多方法可以参考具体的class:
查找(来自@NiranjanBhat 的示例)
@EJB(lookup="java:global/rest/AdminClientLogger")
private ClientLogger clientLogger;
豆名
@EJB(beanName="name of your bean class or name specified in @Stateless(name=".."))
还有
姓名
beanInterface
mappedName
如何使用它们你可以from the java docs about EJB