PlatformTransactionManager

PlatformTransactionManager

我有一个 FooService,我希望只有在 PlatformTransactionManager 可用时才可用。

如果我这样定义我的服务并且没有 PlatformTransactionManager 可用,那么我的应用程序将无法启动:

@Service
public class FooService {
  public FooService(final PlatformTransactionManager txManager) { ... }
  ...
}

我想使用 ConditionalOnBean ,它应该只注释自动配置类。我像这样重构了我的代码:

@Configuration
public class FooAutoConfiguration {
  @Bean
  @ConditionalOnBean(PlatformTransactionManager.class)
  public FooService fooService(final PlatformTransactionManager txManager) {
    return new FooService(txManager);
  }
}

public class FooService {
  public FooService(final BarBean bar) { ... }
  ...
}

我为 FooService 编写了以下测试:

@ExtendWith(SpringExtension.class)
@Import(FooAutoConfiguration.class)
public class FooServiceTest {
  @Autowired
  private FooService fooService;

  @Test
  public void test() {
    System.out.println("fooService = " + fooService);
  }
}

但是当我尝试运行它时出现以下异常:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.acme.FooServiceTest': Unsatisfied dependency expressed through field 'fooService'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.acme.FooService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:596)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:374)
(...)

但是,我知道 PlatformTransactionManager bean 可用,因为当我 @Autowire PlatformTransactionManager 在我的测试中而不是 FooService 时,测试运行良好。

有趣的是,我还尝试用 PlatformTransactionManager 替换 WebClient.Builder ,结果一切正常。 PlatformTransactionManager 有什么特别之处?

如何编写 FooService 以便在 PlatformTransactionManager bean 可用时它可以工作,并且不阻止没有此类 bean 的应用程序启动?

最佳答案

添加 @AutoConfigureOrder 注释以确保在 Spring Boot 注册事务管理器 bean 后处理您的自动配置类:

@Configuration
@AutoConfigureOrder(Ordered.LOWEST_PRECEDENCE)
public class FooAutoConfiguration {

}

关于java - Spring:如何使服务以 PlatformTransactionManager bean 的可用性为条件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54807095/

10-09 08:46