簡體   English   中英

使用@Inject Instance 獲取實現特定接口的 EJB 和 CDI bean

[英]Using @Inject Instance to get EJB and CDI beans that implements specific interface

在我們的應用程序中,我們有 CDI(@ApplicationScoped 注釋)和 EJB(@Stateless 注釋)bean,它們的結構如下:

MyInterface
    MyAbstractClass
       MyBean (CDI or EJB)

我正在使用下面來獲取實現MyInterface 的應用程序中的所有 bean(CDI 和 EJB):

@Inject
Instance<MyIterface> beans;

在這里,我看到了兩個奇怪的事情:

  • 我只得到 CDI bean 而不是 EJB bean。
  • 當創建直接實現MyInterface接口的 EJB bean 時,而不擴展MyAbstractClass ,在這種情況下,這個 bean 被上面的注入注入。

我怎樣才能通過上面的注入獲得所有的 bean、CDI 和 EJB?

引自 EJB 3.2 規范的第 4.9.2.1 節:

 @Stateless public class A implements Foo { ... } @Stateless public class B extends A implements Bar { ... }

假設 Foo 和 Bar 是本地業務接口,並且沒有關聯的部署描述符,會話 bean A 暴露本地業務接口 Foo,會話 bean B 暴露本地業務接口 Bar,但不暴露 Foo。

會話 bean B 需要在其公開的視圖集中顯式包含 Foo,以便應用該接口。 例如:

 @Stateless public class A implements Foo { ... } @Stateless public class B extends A implements Foo, Bar { ... }

在您的示例中,定義為 EJB 的MyBean不公開MyInterface ,因此不會在Instance<MyInterface>處注入。

有兩種處理方法:

  • 將 EJB 聲明為實現MyInterface
  • 使用@Local(MyInterface.class)注釋 EJB

警告@Local的方法 - 此 EJB 將僅滿足那些使用作為注釋參數提供的接口之一的注入點。 你將無法注入它

@Inject
MyBean bean;

此外,您將無法將注入的代理轉換為任何其他類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM