簡単に言うと、これらのクラスがあります
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
}
}
persistClass には正しい Person クラスが割り当てられています。また、BaseServiceImpl の具象型クラスも決定し、その中に queryClass 変数を設定したいと考えています。どうやってやるの?
ありがとう。
更新:詳細については、
BaseController には、そこから新しいインスタンスを作成するための persistentClass (persistentClass.newInstance()) と、JPA エンティティ クラスで宣言されたメソッドと注釈を取得するようないくつかのリフレクションが必要です。
BaseService は、基礎となる DAO レイヤーに実際に委譲するために queryClass (persistentClass と同じでなければなりません) を必要とします。
entityManager.find(queryClass, id);
および同様の操作。
BaseController と BaseService (および BaseDAO) はどちらも、ほとんどのエンティティ CRUD ページ/操作で共通です。