我有一个通用dao类,我试图使用spring依赖注入,但我有以下错误
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'BaseDao' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.abgc.fab.dao.BaseDao]: Constructor threw exception; nested exception is java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class
我的applicationContext.xml文件
<bean id="BaseDao" class="com.abgc.fab.dao.BaseDao">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
我的基础课:
public class BaseDao<TEntity> extends CommonDao<TEntity> implements IBaseDao<TEntity> {
}
public abstract class CommonDao<TEntity> extends FabObject implements ICommonDao<TEntity> {
public CommonDao() {
Type t = getClass().getGenericSuperclass();
ParameterizedType pt = (ParameterizedType) t;
this.classEntity = (Class<TEntity>) pt.getActualTypeArguments()[0];
}
有什么帮助吗?
答案 0 :(得分:1)
TEntity是实际的类还是您的类型参数?
从它看来我的TEntity只是你的类型参数的名称,我相信它不起作用。
你需要像
这样的东西class ConcreteNominationHibernateDAO
extends BaseDao<ConcreteNominationSubclass> {...}
答案 1 :(得分:0)
检查Annotations @ Entity,@ Service等。也许你错过了什么。所以DAO类不能调用POJO类,并且bean无法初始化。
答案 2 :(得分:0)
根据javadoc,ParameterizedType.getActualTypeArguments
会返回Type[]
。 Type
不一定是Class
,因此投放到Class
并不安全。
根据Piotr Findeisen的答案here:
表达式
getClass().getGenericSuperclass()).getActualTypeArguments()[0]
是指替换为AbstractHibernateDAO
的第一个类型参数的值(AbstractHibernateDAO.java
中的T
表示的值)。子类NominationHibernateDAO
替换的类型仍然不具体,它是T extends Nomination
,它绝对不是java.lang.Class
实例,而是Type
实例(TypeVariableImpl
是Type
)的实现。
如果NominationHibernateDAO
声明了类似的内容:
class NominationHibernateDAO extends AbstractHibernateDAO<Nomination, Integer> { ...
然后AbstractHibernateDAO
构造函数魔法会起作用。或者,你可以(或者你甚至应该?)实例化这样声明的NominationHibernateDAO
的子类:
class ConcreteNominationHibernateDAO
extends NominationHibernateDAO<ConcreteNominationSubclass> { ...
或
new NominationHibernateDAO<ConcreteNominationSubclass>() {}
再次,这不会引发问题。
您确定NominationHibernateDAO
类是否可用作Spring bean?
答案 3 :(得分:0)
拥有深层次结构,您需要使用类似TypeTools的内容:
class DeviceDao extends BaseDao<Device> {}
Class<?> entityType = TypeResolver.resolveRawArgument(IBaseDao.clas, DeviceDao.class);
assert entityType == Device.class;
注意:与往常一样,只有在类型定义中捕获类型参数时才能在运行时解析它们。因此,必须对BaseDao
进行子类化。