2017-08-25 61 views
0

我有以下CDI豆:鈍化CDI的SessionBean與構造器注入

@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應用(Tomcat的與焊接)以下異常被拋出:

WELD-001435:正常作用域bean類 com.myorg.ReportService不是proxyable因爲它 沒有無參數的構造函數 - Managed Bean的[類 com.myorg.ReportService]與預選賽[@Any @default。

怎麼可能使用構造函數注入在SessionScoped豆? 僅僅添加一個package-visible無參數構造函數是否安全?

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

+0

MyDao是公開課嗎?它有沒有參數的構造函數? –

+0

Weld抱怨無參數構造函數,因爲它想要代理bean。這與鈍化無關。 CDI/EJB負責鈍化bean,然後將其恢復到完整的功能狀態。激活不必再使用構造函數構造對象(我認爲)。 **底線:我相信可以在你的bean類中添加一個包私有的默認構造函數。** –

+0

編輯我的文章:添加MyDao代碼 MyDao是一個@RequestScoped CDI Bean。如果我在那裏刪除受保護的構造函數,那麼拋出相同的焊接錯誤。 WELD-001435:正常範圍的bean類com.myorg.MyDao不可代理,因爲它沒有無參數構造函數 - 具有限定符[@Any @Default]的受管Bean [類com.myorg.MyDao]。 – shoutcool

回答

0

你得到的錯誤是基於CDI specification requirements,即需要沒有參數的構造函數。當實例化對象時,CDI當然會優先考慮用@Inject註解的構造函數,所以不用擔心。

真正的原因是你需要無參數的是代理。 Weld/CDI將嘗試創建一個或多個代理對象,它們基本上是一個豐富的代表。爲了實例化它們,你想調用no-arg構造函數 - 把它看作Java限制,你不應該在不調用構造函數的情況下實例化對象。因此該規範強制要求無參數構造函數。事實上,Weld本身可以允許你在某些情況下bypass this need,但我強烈建議不要這樣做。

僅僅添加一個package-visible無參數構造函數是否安全?

是的,繼續做下去。