在Spring中实例化泛型类bean时出现问题

在Spring中实例化泛型类bean时出现问题,spring,generics,dependency-injection,Spring,Generics,Dependency Injection,我试图在Spring中实例化一个泛型类,但出现以下异常: bean初始化失败;嵌套异常是 org.springframework.aop.framework.aopconfigeexception:无法生成类[class football.dao.jpa.GenericJpaDAO]的CGLIB子类:此问题的常见原因包括使用最终类或不可见类;嵌套异常为java.lang.IllegalArgumentException:超类没有空构造函数,但未提供任何参数: 这是Spring容器的XML配置:

我试图在Spring中实例化一个泛型类,但出现以下异常:

bean初始化失败;嵌套异常是 org.springframework.aop.framework.aopconfigeexception:无法生成类[class football.dao.jpa.GenericJpaDAO]的CGLIB子类:此问题的常见原因包括使用最终类或不可见类;嵌套异常为java.lang.IllegalArgumentException:超类没有空构造函数,但未提供任何参数:

这是Spring容器的XML配置:

<bean id="clubDAO" class="football.dao.jpa.GenericJpaDAO">
    <constructor-arg type="EntityManagerFactory" ref="entityManagerFactory"/>
    <constructor-arg type="Class" value="football.model.entities.ClubEntity"/>
    <constructor-arg type="String" value="ClubEntity"/>
</bean>

这是泛型类:

public class GenericJpaDAO <T extends HavingID> {

  private EntityManager em;
  private Class entityClass;
  private String entityName;

  public GenericJpaDAO( Class entityClass, String entityName,
        EntityManagerFactory emFactory ) {
    this.entityClass = entityClass;
    this.entityName = entityName;
    em = emFactory.createEntityManager();
  }

  @Transactional
  public void create( T entity ) {
      em.persist( entity );
  }
  // more methods

}
公共类GenericJpaDAO{
私人实体管理者;
私有类实体类;
私有字符串entityName;
public GenericJpaDAO(类entityClass,字符串entityName,
实体管理工厂(工厂){
this.entityClass=entityClass;
this.entityName=entityName;
em=emFactory.createEntityManager();
}
@交易的
公共无效创建(T实体){
em.persist(实体);
}
//更多方法
}

我真的不确定是什么导致了这一切。如果有任何想法,我将不胜感激。

这个问题与泛型无关,它是Spring AOP的一个限制

如果使用CGLIB代理将方面(包括
@Transactional
方面)应用于类(如果目标类未实现任何接口,或者如果AOP配置了
proxy target class=“true”
),则不需要参数构造函数:

public class GenericJpaDAO <T extends HavingID> { 
  ...

  public GenericJpaDAO() {}

  public GenericJpaDAO( Class entityClass, String entityName, 
        EntityManagerFactory emFactory ) { ... } 
  ...
}
公共类GenericJpaDAO{
...
public GenericJpaDAO(){}
public GenericJpaDAO(类entityClass,字符串entityName,
EntityManagerFactory(工厂){…}
...
}
另请参见:


Spring4和Objensis允许在没有默认(即:无参数)构造函数的情况下代理类,请参阅