2010-10-19 8 views
8

Instanziieren Ich versuche, eine generische Klasse im Frühjahr zu instanziieren, aber ich folgende Ausnahme erhalten:Problem generische Klasse Bohne im Frühjahr

Initialisierung der Bohne fehlgeschlagen; verschachtelte Ausnahme ist org.springframework.aop.framework.AopConfigException: Konnte CGLIB-Unterklasse der Klasse nicht generieren [Klasse football.dao.jpa.GenericJpaDAO]: Häufige Ursachen für dieses Problem sind die Verwendung einer letzten Klasse oder einer nicht sichtbaren Klasse. verschachtelte Ausnahme ist java.lang.IllegalArgumentException: Superklasse hat keine Null-Konstrukteuren aber keine Argumente gegeben wurden:

Dies ist die XML-Konfiguration für den Frühling Container:

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

Dies ist die allgemeine Klasse:

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 

} 

Ich bin nicht wirklich sicher, was könnte das verursachen. Ich würde mich über irgendwelche Ideen freuen.

Antwort

19

Dieses Problem bezieht sich nicht auf Generika, es ist eine Einschränkung von Spring AOP.

Wenn Aspekte (einschließlich @Transactional Aspekt) auf die Klasse angewendet werden unter Verwendung CGLIB proxy (dies geschieht, wenn Zielklasse implementieren keine Schnittstellen oder wenn AOP ist konfiguriert mit proxy-target-class = "true"), kein Argument-Konstruktor erforderlich:

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

    public GenericJpaDAO() {} 

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

Siehe auch:

+1

Spring 4 mit Objenesis erlaubt das Proxying von Klassen ohne Standardkonstruktor (zB: no-arg), siehe https://jira.springsource.org/browse/SPR-3150 – tukushan

Verwandte Themen