2

簡単に言うと、これらのクラスがあります

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 ページ/操作で共通です。

4

1 に答える 1

1

あなたができることは、次のようBaseServiceFactoryに実際の代わりにa を注入することです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);
于 2012-07-14T18:23:03.573 に答える