簡體   English   中英

EJB 3.1-為什么必須通過其接口(如果有)注入無核Bean?

[英]EJB 3.1 - Why sateless bean must be injected by its interface (if there is one)?

從EJB 3.1開始,bean不需要具有Local接口,而且我通常不使用以下接口:

@Stateless
public class MyService(){
    public void buisnesssMethodA(){
        ...
    }

    public void buisnesssMethodB(){
        ...
    }
}

在我的CDI bean中

@Inject
private MyService myService;

這很容易和簡單,並且效果很好。

現在我最近發現了一些東西。

想象一下,我需要一個代表我的業務方法子集的接口。

public interface MyInterface{
    void businessMethodA();
}

現在,如果我讓我的Stateless bean實現此接口,JBoss將無法部署並引發錯誤

WELD-001408 Unsatisfied dependencies for type [MyService] with qualifiers [@Default] at injection point [[field] @Inject

因此,我相信我遵守以下規則:

如果無狀態bean沒有接口,則可以使用該類將其注入。 如果實現接口,則必須使用該接口注入。

這是我的問題:

  1. 這個規則正確嗎?
  2. 如果是,則由EBJ規范定義嗎?
  3. 限制的原因是什么?

根據我對Java EE和CDI的有限了解:

  • CDI本身不管理EJB 3.1無狀態會話Bean(它沒有所有的生命周期和攔截器),但可以@Inject公開那些Bean的公開本地視圖
  • 會話Bean如果具有接口視圖或無接口視圖(由Bean公共方法組成),則可能會公開本地業務接口視圖
  • 在Java EE 7中,當會話bean不實現任何接口時,默認情況下它將公開無接口視圖-因此您可以在沒有接口的情況下注入MyService。 這等效於使用@LocalBean注釋bean。 請注意,即使bean類實現了接口,使用@LocalBean也會公開無接口視圖-因此Tom的注釋起作用了
  • 在Java EE 7中,如果會話Bean實現了一個接口且未標記為@LocalBean,則默認情況下此接口公開為Bean的本地視圖-因此,在實現MyInterface后,由於無接口視圖(MyService),因此無法注入MyService不再公開,而接口視圖MyInterface公開為本地視圖

希望這能回答您的問題3,並部分確認您的問題,使您從questoin 1中獲得的規則無效。盡管如此,我現在不願意回答問題2。

暫無
暫無

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

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