2010-10-19 11 views
8

sto cercando di creare un'istanza di una classe generica in primavera, ma ottengo seguente eccezione:Problema un'istanza di fagioli classe generica nella primavera

inizializzazione dei fagioli non è riuscita; l'eccezione annidata è org.springframework.aop.framework.AopConfigException: Impossibile generare sottoclasse CGLIB della classe [class football.dao.jpa.GenericJpaDAO]: cause comuni di questo problema includono l'uso di una classe finale o di una classe non visibile; l'eccezione annidata è java.lang.IllegalArgumentException: superclasse non ha costruttori nulli, ma senza argomenti è stata data:

Questa è la configurazione XML per container Primavera:

<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> 

Questa è la classe generica:

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 

} 

Non sono sicuro di cosa potrebbe causare questo. Gradirei qualsiasi idea.

risposta

19

Questo problema non è correlato ai generici, è un limite di Spring AOP.

Se aspetti (compresi @Transactional aspetto) sono applicati alla classe utilizzando il proxy CGLIB (questo accade se classe obiettivo non implementa alcuna interfaccia o se AOP è configurato con proxy-target-class = "true"), non è richiesta alcuna-argomento del costruttore:

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

    public GenericJpaDAO() {} 

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

Consulta anche:

+1

Spring 4 with Objenesis consente il proxy delle classi senza costruttore predefinito (ad esempio: no-arg), vedere https://jira.springsource.org/browse/SPR-3150 – tukushan

Problemi correlati