Spring依赖注入通用服务类

时间:2015-01-20 13:02:29

标签: java spring dependency-injection dao

我有一个通用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]; 
      }

有什么帮助吗?

4 个答案:

答案 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实例(TypeVariableImplType)的实现。

如果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进行子类化。