2017-09-05 82 views
1

问题: 当我在两个其他类(Servlets)中注入的2个子类注入Bean(在过滤器中)时,我有一些意外的行为。现在,注入的超类可以在运行时持有对子类实例的引用(随每个容器重新启动而更改)。注入的超类Bean如何获​​取注入的错误实例(子类Bean实例)?

我一定犯了一个严重的错误,但我无法弄清楚究竟是什么。

其他信息:

我使用Java EE 6

类结构:

在我注入,其保持的随机实例的子类中的一个或超类的过滤器超类:

@EJB 
private ClientLogger clientLogger; 

su每过班开始是这样的:

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

private Client client; 

public ClientLogger(){ 
} 

.... 

} 

该子豆我在我的Servlet的一个注:

@Stateless 
@LocalBean 
public class AdminClientLogger extends ClientLogger { 

public AdminClientLogger(){ 
} 
... 
} 

解决方案的尝试:

所以据我了解的子类,获取最后一次注入将是由clientLogger引用的实例,但为什么我为什么不能有3个不同的实例并在这里使用继承?

编辑: 我注入多个查询豆类,所有实现相同的接口,所有的人都将持有相同的实例的引用,当再次面对这个问题。

解决的办法是增加beanName德恩注入接口EJB

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

回答

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="..")) 

还有

1

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

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

很明显,您将不得不在上面的示例中更改JNDI查找路径。