Java 注入的超类Bean如何注入错误的实例(子类Bean实例)?
问题: 当我在另外两个类(servlet)中注入带有2个子类的Bean(在过滤器中)时,我出现了一些意想不到的行为。现在,注入的超类可以在运行时保存对子类实例的引用(随着每次容器重启而改变) 我一定犯了一个严重的错误,但我不太清楚到底是什么 其他信息: 我使用JavaEE6 班级结构: 在过滤器中,我将包含随机实例的超类注入子类或超类之一: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
@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=".."))