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
    }
}

为persistentClass分配了正确的Person类,我也想确定BaseServiceImpl中的具体类型类,在其中设置queryClass变量。我怎样才能做到这一点?
谢谢。
更新:更多细节,
BaseController 需要persistentClass 来从中创建新实例(persistentClass.newInstance())和一些反射的东西,比如在JPA 实体类中获取声明的方法和注释。

BaseService 需要 queryClass(必须与 persistentClass 相同)才能将其实际委托给底层 DAO 层,而 DAO 类则简单地使用它

entityManager.find(queryClass, id);

和类似的操作。
BaseController 和 BaseService(和 BaseDAO)对于大多数实体 CRUD 页面/操作都很常见。

4

1 回答 1

1

您可以做的是注入 aBaseServiceFactory而不是实际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 回答