2010-10-19 19 views
8

Estoy intentando crear una instancia de una clase genérica en la primavera, pero me da siguiente excepción:crear instancias de frijol clase genérica en la primavera

inicialización de frijol fracasó; la excepción anidada es org.springframework.aop.framework.AopConfigException: No se pudo generar la subclase CGLIB de la clase [class football.dao.jpa.GenericJpaDAO]: Las causas comunes de este problema incluyen el uso de una clase final o una clase no visible; excepción anidada es java.lang.IllegalArgumentException: Superclass tiene constructores nulos pero no se proporcionaron argumentos:

Esta es la configuración XML para el envase de 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> 

Esta es la clase genérica:

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 

} 

No estoy seguro de qué podría estar causando esto. Agradecería cualquier idea.

Respuesta

19

Este problema no está relacionado con los genéricos, es una limitación de Spring AOP.

Si aspectos (incluyendo @Transactional aspecto) se aplican a la clase utilizando CGLIB proxy (esto sucede si la clase de destino no implementa ninguna interfaz o si AOP está configurado con proxy-target-class = "true"), se requiere constructor sin argumentos:

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

    public GenericJpaDAO() {} 

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

Consulte también:

+1

Spring 4 with Objenesis permite el proxying de clases sin un constructor predeterminado (es decir: no-arg), consulte https://jira.springsource.org/browse/SPR-3150 – tukushan

Cuestiones relacionadas