簡體   English   中英

使用構造函數注入對CDI SessionBean進行鈍化

[英]Passivation of CDI SessionBean with Constructor Injection

我有以下CDI Bean:

@SessionScoped
public class ReportService implements Serializable {
    private static final long serialVersionUID = 1L;

    private MyDao myDao;

    @Inject
    public ReportService(MyDao myDao) {
        this.myDao = myDao;
    }
}

@RequestScoped
public class MyDao extends AbstractDao<Order> {

    protected MyDao() {

    }

    @Inject
    public MyDao(EntityManager em) {
        super(em);
    }
}

如果我啟動Web應用程序(帶有Weld的Tomcat),則會引發以下異常:

WELD-001435:普通范圍內的Bean類com.myorg.ReportService無法代理,因為它沒有no-args構造函數-帶有限定符[@Any @Default]的托管Bean [類com.myorg.ReportService]。

如何在SessionScoped Bean中使用構造函數注入? 僅添加包可見的無參數構造函數是否安全?

我已經進行了很多搜索,但沒有找到有關使用構造函數注入鈍化CDI Bean的任何信息。

您收到的錯誤基於CDI規范要求 ,即需要無參數構造函數。 實例化對象時,CDI當然會優先使用@Inject注釋的構造函數,因此不必擔心。

不需要參數的真正原因是代理 Weld / CDI將嘗試為您的對象創建一個或多個代理,這些代理基本上是一個豐富的委托。 為了實例化它們,您想調用no-arg構造函數-將其視為Java limiation,您不應該在不調用構造函數的情況下實例化對象。 因此,規范要求需要無參數構造函數。 事實上, 在某些情況下 ,Weld本身可以讓您繞過此需求 ,但我強烈建議您不要這樣做。

僅添加包可見的無參數構造函數是否安全?

是的,繼續這樣做。

暫無
暫無

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

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