我正在尝试在Spring中实例化一个泛型类,但我得到以下异常:
bean初始化失败;嵌套异常是 org.springframework.aop.framework.AopConfigException:无法生成类[class football.dao.jpa.GenericJpaDAO]的CGLIB子类:此问题的常见原因包括使用final类或不可见类;嵌套异常是java.lang.IllegalArgumentException:Superclass没有null构造函数但没有给出参数:
这是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
}
我不确定是什么导致这种情况。我很感激任何想法。
答案 0 :(得分:19)
这个问题与泛型有关,这是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 ) { ... }
...
}
另见: