2017-09-05 59 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查找路徑。