2012-07-14 85 views
2

的parameterizedType,使長話短說,我有這些類如何確定具體類型注入CDI豆

public class BaseController<T extends BaseEntity, ID extends Serializable> implements Serializable { 
    @Inject 
    private BaseService<T> service; 
    private Class<T> persistentClass; 

    public void init() { 
     Type arg = ((ParameterizedType) ((Class) getClass().getGenericSuperclass()).getGenericSuperclass()).getActualTypeArguments()[0]; 
     persistentClass = (Class<T>) arg; 
    } 

    // Other stuff 
} 

public interface BaseService<T extends BaseEntity> { 
} 

public class BaseServiceImpl<T extends BaseEntity> implements BaseService<T>, Serializable { 
    private Class<T> queryClass; 
    public BaseServiceImpl(){ 
     // Set the above queryClass through Java Reflection and/or CDI. Stucked here! 
    } 
} 

當我繼承了BaseController諸如此類

public class PersonController extends BaseController<Person, Long> { 

    @Override 
    @PostConstruct 
    public void init() { 
     super.init(); 
     // other stuff 
    } 
} 

的對PersistentClass被賦予Person類是正確的,我也想在BaseServiceImpl中確定具體類型類,以在其中設置queryClass變量。我怎樣才能做到這一點?
謝謝。
更新:更多細節,
的BaseController對PersistentClass需要從它創建新實例(persistentClass.newInstance())和一些反思的東西想獲得在JPA實體類中聲明的方法和註釋。

的BaseService需要queryClass(必須是相同的對PersistentClass)來實際委託給基礎DAO層,其又在DAO類簡單地使用它在

entityManager.find(queryClass, id); 

和類似的操作。
兩個BaseController和BaseService(和BaseDAO)是大多數實體CRUD頁/操作的通用。

+0

它是什麼,你真的需要知道,爲什麼? – 2012-07-14 15:46:43

+0

@ThorbjørnRavnAndersen增加了更多細節。 – 2012-07-14 16:07:09

+0

@UlukBiy改爲注入工廠? – munyengm 2012-07-14 18:24:11

回答

1

你可以做的是注入BaseServiceFactory而不是實際的BaseService<T>如下:

public interface BaseServiceFactory { 

    <T> BaseService<T> create(Class<T> queryClass); 
} 

public class BaseController<T extends BaseEntity, ID extends Serializable> implements Serializable { 
    @Inject 
    private BaseServiceFactory<T> serviceFactory; 
// . 
// . 
// . 
} 

然後修改BaseServiceImpl構造如下:

public class BaseServiceImpl<T extends BaseEntity> 
    implements BaseService<T>, Serializable { 
    private final Class<T> queryClass; 

    public BaseServiceImpl(Class<T> queryClass){ 
     this.queryClass = queryClass; 
    } 
} 

,然後得到適當類型類如如下:

BaseService<T> service = serviceFactory.create(persistentClass); 
+0

感謝您的輸入,但是我看不到create方法的實現。如果有新的BaseServiceImpl將被返回,那麼我認爲我將失去CDI的好處。 – 2012-07-16 11:43:43

+0

請詳細說明「我將失去CDI的好處」。您可以實施創建方法以滿足您的需求。即安排工廠創建單個實例並將該實例返回給所有的調用。 – munyengm 2012-07-17 15:10:30

+0

我不能使用工廠模式,現在導致階級結構比的問題更加複雜。但是你的回答是這個問題。 – 2012-07-21 08:22:00