2014-11-03 14 views
0

這是,簡單地說,我的建築:如何使CDI決定的執行情況根據泛型類型的bean的使用

enter image description here

我想實現的是讓CDI注入的正確實施控制器內部的BO以及BO內的DAO的正確實現對應於控制器的通用類型。

我該如何做到這一點?

+0

您的_Generic_類是抽象的嗎?您的T類型是在子類還是其他地方解決? – 2014-11-03 17:30:45

+0

只有GenericController.java是抽象的,因爲我需要在某些地方實例化bo和dao的泛型實現,所以它們不能抽象,我的T類型在控制器中解析並通過bo和dao傳播。 – 2014-11-03 18:22:13

+0

無論如何,我找到了一個解決方案,我很快就會發布 – 2014-11-03 18:22:37

回答

1

我使用javax.enterprise.inject.Instance對象來封裝我的bo和dao,解決了這個問題。通過這種方式:

@Inject 
private Instance<CrudBO<T>> bo; 

public CrudBO<T> getBo() { 
    return bo.get(); 
} 

只是爲了把事情說清楚,CrudBO是GenericCrudBO實現了接口,所以, 知道,默認情況下GenericCrudBO標註有@default,我詮釋了專門的教學班,@Alternative:

@Alternative 
public class SpecializedCrudBO extends GenericCrudBO<SpecificClass>{ 
} 

我也宣告了替代BO的和DAO在beans.xml中:

<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> 

    <alternatives> 
     <class>com.kichel.marcos.business.SpecializedCrudBO</class> 
     ... 
    </alternatives> 

</beans> 

現在CDI可以處理我的普通的java bean在運行時,這非常好,因爲我不需要創建大量的樣板類。

相關問題