我有一個GenericCrudController<E>
,它封裝了我的GenericCrudBO<E>
的一個實例,我的GenericCrudBO<E>
封裝了我的GenericCrudDAO<E>
的一個實例。所以,我想要做的是,例如,我的GenericCrudController<User>
默認具有GenericCrudBO<User>
的實現,當然,如果有的話。如果沒有,我想堅持通用的實現。我在項目中使用CDI,我認爲這是要走的路,但我不知道使用什麼註釋。上述的結構和場景隨之而來的:決定在@Inject中使用什麼實現
public abstract class GenericController<T extends BaseEntity> implements Serializable {
private static final long serialVersionUID = 1L;
protected List<T> list;
protected T entity;
protected T filter;
@Inject
@Named("crudBO")
protected CrudBO<T> bo;
/*IRRELEVANT CODE GOES THERE */
}
@Named("crudBO")
public class GenericCrudBO<E extends BaseEntity> implements CrudBO<E>{
private static final long serialVersionUID = 1L;
@Inject
@Named("crudDAO")
protected GenericCrudDAO<E> dao;
@Override
@SuppressWarnings("unchecked")
public List<E> search(E filter) {
Class<E> clazz = (Class<E>) filter.getClass();
return dao.search(clazz, filter);
}
/*IRRELEVANT CODE GOES THERE*/
}
@Named("crudDAO")
public class GenericCrudDAO<E extends BaseEntity> implements CrudDAO<E>{/*IRRELEVANT CODE GOES THERE*/}
這些都是實現通用結構的一些例子:
public class UserBO extends GenericCrudBO<User>{
/*IRRELEVANT CODE GOES THERE*/
@Override
public List<User> search(User filter) {
/*SPEFIFIC CODE*/
}
}
@Named(value="userController")
@ViewScoped
public class UserController extends GenericController<User>{
@Inject private UserBO userBO;
@Override
public void search() {
if(filter != null) {
list = userBO.search(filter);
} else throw new RuntimeException();
}
}
現在發現,我必須手動注入UserBO的實例,並覆蓋搜索方法能夠實現我調用UserBO的搜索方法而不是GenericCrudBO的目標。我所要求的是,如果它可能用一些CDI註解來實現,迫使處理器根據控制器的通用類型注入正確實現的實例。謝謝
我只通過手動實現嵌套類型的具體實例來完成此操作。由於java泛型的本質,我想沒有更好的方法。但我很樂意被證明是錯誤的。 – 2014-09-20 09:35:36
如果你提供了一個具體的例子,它會有所幫助。什麼是完全失敗? – 2014-09-20 19:55:51
剛剛添加了一些具體的例子,希望它有助於:) @JohnAment – 2014-09-22 18:05:33