@Repository从中删除注释
AbstractGenericDAO并使其
abstract:
public abstract class AbstractGenericDAO<T extends Serializable, ID extends Serializable> implements GenericDAO<T, ID>
发生您的问题是因为
@Repository的特化
@Component,这意味着Spring将尝试创建
AbstractGenericDAO注入实例。由于
AbstractGenericDAOsuperclass(
Object)不是通用的,因此您无法将其向下转换
Type为
ParameterizedType,因此这行代码将失败(与尝试使用手动实例化该代码的方式相同
newAbstractGenericDAO()):
this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
专业课
ShlkActiveWorkflowDAOImpl仍应使用注释
@Repository。当spring尝试创建此类的实例时,
AbstractGenericDAO将对构造函数进行隐式调用,但是这一次上面提到的代码行将按预期运行。发生这种情况是因为
getClass()return
ShlkActiveWorkflowDAOImpl.class是泛型的子类
AbstractGenericDAO(因此向下转换
ParameterizedType有效)。
由于
ShlkActiveWorkflowDAOImpl
extends
AbstractGenericDAO<ShlkActiveWorkflow,Serializable>实际类型
ShlkActiveWorkflow将在运行时正确反映。这是避免将
Class<T>引用传递给
AbstractGenericDAO构造函数的已知解决方法。
如果您对的
@Autowired注释感到担心
AbstractGenericDAO,请不必担心。当您注入其子类之一的实例时,Spring会正确地连接一切。



