Проблема создания экземпляра универсального класса bean в Spring - PullRequest
8 голосов
/ 19 октября 2010

Я пытаюсь создать экземпляр универсального класса в Spring, но получаю следующее исключение:

Не удалось инициализировать компонент; вложенное исключение org.springframework.aop.framework.AopConfigException: не удалось создать подкласс CGLIB класса [class football.dao.jpa.GenericJpaDAO]: общие причины этой проблемы включают использование финального класса или невидимого класса; Вложенное исключение - java.lang.IllegalArgumentException: суперкласс не имеет нулевых конструкторов, но аргументы не были предоставлены:

Это конфигурация XML для контейнера Spring:

<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

}

Я не совсем уверен, что может быть причиной этого. Буду признателен за любые идеи.

1 Ответ

19 голосов
/ 19 октября 2010

Эта проблема не связана с обобщениями, это ограничение 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 ) { ... } 
  ...
}

См. также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...