2010-10-19 32 views
8

我試圖實例在Spring的通用類,但實例化通用級bean我得到以下異常:問題春

bean的初始化失敗;嵌套異常是 org.springframework.aop.framework.AopConfigException:無法生成類[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 

} 

我不確定可能導致這種情況。我會很感激任何想法。

回答

19

此問題與泛型無關,它是Spring AOP的限制。

如果方面(包括@Transactional方面)被施加到使用CGLIB代理(在此發生,如果目標類沒有實現任何接口或如果AOP配置有proxy-target-class = "true")類,需要無參數構造:

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

    public GenericJpaDAO() {} 

    public GenericJpaDAO(Class entityClass, String entityName, 
     EntityManagerFactory emFactory) { ... } 
    ... 
} 

參見:

+1

Spring 4與Objenesis允許代理沒有默認的類(即:no-arg)構造函數,請參閱https://jira.springsource.org/browse/SPR-3150 – tukushan 2013-12-17 16:45:01