长话短说,我有这些课程
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 页面/操作都很常见。