java - 由于事务传播无法 Autowiring 组件

标签 java spring transactions entitymanager

我开始使用 TDD 编写以下代码:

 @Component("GrantingOfLoanSagaManager")
 public class GrantingOfLoanSagaManager implements
    SagaManager {

     private ApplicationContext applicationContext;

     @PersistenceContext
     private EntityManager entityManager;

     public GrantingOfLoanData createNewSagaData(AggregateId id ) {
         GrantingOfLoanData sagaData = new GrantingOfLoanData();
         sagaData.setRequestId(id);
         entityManager.persist(sagaData);
         return sagaData;
    }
 } 

并测试此 SagaManager 类:

 @RunWith(SpringJUnit4ClassRunner.class)
 @WebAppConfiguration
 @ContextConfiguration(
    classes = ConfigTest.class)
 public class SagaTest {

     @PersistenceContext
     EntityManager entityManager;

     private ApplicationContext applicationContext;

     private GrantingOfLoanSagaManager sagaManager;

     @Autowired
     public void setApplicationContext(ApplicationContext applicationContext) {
         this.applicationContext = applicationContext;
     }

     @Autowired
     public void setSagaManager(GrantingOfLoanSagaManager sagaManager) {
         this.sagaManager = sagaManager;
     }

     @Test
     @Transactional
     public void onCompleteEventsTriggered(){

     Client client = new Client();
         entityManager.persist(client);

     invokeFromSagaManagerCreateNewSagaData_method(); //some code that invoke via spring createNewSagaData() method in SagaManager
     }
}

但是后来我对这个 createNewSagaData() 方法遇到了一些问题,因为它使用 EntityManager 将对象保存在数据库中,自然地它应该从事务上下文运行以将 newSagaData 保存在数据库中,每个调用 createNewSagaData() 的方法都应该有 @事务注释并创建新事务。所以我发现它是不兼容的解决方案,我更改了 createNewSagaData 方法,如下所示:

    @Transactional //Annotation was added
    public GrantingOfLoanData createNewSagaData(AggregateId id ) {
        GrantingOfLoanData sagaData = new GrantingOfLoanData();
        sagaData.setRequestId(id);
        entityManager.persist(sagaData);
        return sagaData;
    }

正如我所提到的,我认为我唯一需要的是创建一个新事务(可能使用propagation=REQUIRED_NEW)

但是之后,当我运行unitTests(/集成测试)时,我得到了以下异常:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.finance.app.core.domain.businessprocess.loangrant.GrantingOfLoanSagaManager] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

所以我不知道如何解决它。我应该对调用 EntityManager 的每个外部方法使用 @Transactional 吗?

最佳答案

如果您将 Bean 名称用作像这样的限定符,则它们必须以小写字母开头:@Component("grantingOfLoanSagaManager"),但如果没有必要,我不会使用限定符。 Autowire 按类型扫描正确的 bean。此外,您还应该使用 @Transactional@TransactionConfiguration

标记整个测试类

关于java - 由于事务传播无法 Autowiring 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24150493/

相关文章:

java - 在数据绑定(bind)中将另一个 View 作为参数传递

java - 更改 Java Swing 组件焦点指示器的颜色

java - 包 org.springframework.cloud.netflix.zuul 不存在

java - @Transactional 处理 Spring 中的任何异常

java - hadoop NaturalKeyGroupingComparator - Reducer 中发生了什么?

spring - 如何在 spring boot 中使用 mockito 模拟 deleteById

java - 使用 Spring Boot 和注释配置 ViewResolver 给出 No mapping found for HTTP request with URI error

java - Spring : how to get multiple datasource with GenericDao?

SQL Server : is it possibile to use UPDLOCK with non-clustered index?

java - Uri.parse 与本地 ip 地址