【问题标题】:@Repository Not Being Autowired in @DataJpaTest with multiple @Configuration files being imported in one Configuration file@Repository 未在 @DataJpaTest 中自动装配,多个 @Configuration 文件被导入到一个配置文件中
【发布时间】:2018-05-07 20:39:15
【问题描述】:

我有三个@Configuration文件,如下:

MessageGatewayConfiguration.class

 @Configuration
 @EnableAutoConfiguration
 @EnableJpaRepositories(basePackages = {
            "xyz.idtlabs.smsgateway.*"
})
@EntityScan(basePackageClasses = {
        AbstractPersistableCustom.class,
        SMSBridge.class,
        SMSBridgeConfig.class,
        SMSMessage.class,
        Tenant.class
})
@ComponentScan(basePackages = {
        "xyz.idtlabs.smsgateway.*"
})
public class MessageGatewayConfiguration {  
    public MessageGatewayConfiguration() {
        super();
    } 
    @Bean
    public SimpleApplicationEventMulticaster applicationEventMulticaster() {
        final SimpleApplicationEventMulticaster multicaster = new SimpleApplicationEventMulticaster();
        multicaster.setTaskExecutor(new SimpleAsyncTaskExecutor());
        return multicaster;
    } 
    @Bean
    public HandlerExceptionResolver sentryExceptionResolver() {
        return new io.sentry.spring.SentryExceptionResolver();
    }     
} 

SpringConfiguration.class

@Configuration
@EnableMetrics
public class SpringConfiguringClass extends MetricsConfigurerAdapter {

    @Override
    public void configureReporters(MetricRegistry metricRegistry) {
        // registerReporter allows the MetricsConfigurerAdapter to
        // shut down the reporter when the Spring context is closed
        registerReporter(ConsoleReporter
            .forRegistry(metricRegistry)
            .build())
            .start(1, TimeUnit.MINUTES);
    }
} 

SmsFireboltConfiguration.class

@Configuration
@Import({ MessageGatewayConfiguration.class, SpringConfiguringClass.class })
public class SmsFireboltConfiguration { 
} 

主要应用文件如下:

public class MessageGateway {

    public MessageGateway() {
        super();
    }

    public static void main(String[] args) {
        SpringApplication.run(SmsFireboltConfiguration.class, args);
    }
} 

但是,我的 Spring @DataJpaTest 集成测试没有自动装配 TenantRepository JPA 存储库,“没有可用的 'xyz.idtlabs.smsgateway.tenants.repository.TenantRepository' 类型的合格 bean:预计至少有 1 个合格的 bean自动接线候选”错误。 其代码如下:

@DataJpaTest
@RunWith(SpringRunner.class)
@ContextConfiguration(classes=MessageGateway.class)
@AutoConfigureTestDatabase(connection = H2)
public class SmsMessageServiceIntegrationTest { 

    @Autowired
    private TenantRepository tenantRepository; 

      @After
      public void tearDown() throws Exception {
          tenantRepository.deleteAll();
      } 
    @Test
    //some test
} 

关于为什么会这样的任何可能的想法?我尝试了多种设置@DataJpaTest 文件的组合,但无济于事。

【问题讨论】:

  • TenantRepository 类有一个注解@Repository 对吗?
  • 请发布异常的完整堆栈跟踪
  • 是的@AmrAlaa,确实如此。还有 Jens Schauder,感谢您的帮助!我遵循了 Sam Brenna 在下面的建议,它解决了我的问题。非常感谢!

标签: spring spring-data-jpa spring-test


【解决方案1】:

您为@ContextConfiguration 指定了一个非配置类。

你需要的是:

@ContextConfiguration(classes = MessageGatewayConfiguration.class)

如果您想包含所有 Spring 配置,请使用以下内容:

@ContextConfiguration(classes = SmsFireboltConfiguration.class)

【讨论】:

  • 非常感谢!将 MessageGatewayConfiguration.class 或 SmsFireboltConfiguration.class 添加到 @ContextConfiguration 注释修复了这个问题。
  • 太棒了!很高兴这有帮助。介意接受答案吗? ;)
  • 不客气,感谢您接受我的回答!
猜你喜欢
  • 2020-05-31
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多