@p-oleg

Почему при создании контекста спринга через GenericXmlApplicationContext не работает @Transactional?

Есть класс
@Repository
@Transactional(readOnly = true)
public class JpaAssetsRepository implements AssetsRepository {
    @Override
    public boolean save(List<Assets> assets) {
        return false;
    }
}


Пробую запустить:
public class MainTest {
    public static void main(String[] args) {
        try (GenericXmlApplicationContext appCtx = new GenericXmlApplicationContext()) {
            appCtx.load("spring/spring-app.xml", "spring/spring-db.xml");
            appCtx.refresh();
            System.out.println("Bean definition names: " + Arrays.toString(appCtx.getBeanDefinitionNames()));
            JpaAssetsRepository rep3 = appCtx.getBean(JpaAssetsRepository.class);
            rep3.save();
        }
    }
}


Код валится с ошибкой:
Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'тут_название_пакета.repository.jpa.JpaAssetsRepository' available

В spring/spring-app.xml и spring/spring-db.xml есть все необходимое:
<context:annotation-config/>
<tx:annotation-driven/>
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
          p:entityManagerFactory-ref="entityManagerFactory"/>


Если из репозитория убрать @Transactional(readOnly = true), то все отрабатывает...
  • Вопрос задан
  • 216 просмотров
Решения вопроса 1
@TonyJa
Spring, когда видит @Transactional создает прокси по интерфейсу AssetsRepository, поэтому он и не находит JpaAssetsRepository. Попробуйте делать лукап по интерфейсу
AssetsRepository rep3 = appCtx.getBean(AssetsRepository .class)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы