Spring Boot:应用程序上下文无法加载外部组件

时间:2017-02-14 16:06:21

标签: java spring spring-boot spring-test

我做了一个示例Spring启动应用程序,用于向Hosted Graphite发送指标。为此我添加了一个Metrics Manager类。

@Component
public class MetricsManager {


    @Autowired
    private MetricRegistry metricsRegistry;

    private GraphiteReporter reporter;

    /**
     * Method connects Boot project with graphite server to push the metrics
     * data. It registers with graphite server only if the graphite
     * information(hostname, port) is available.
     *
     * Property ‘graphiteConfigParams’ should be configured in following format.
     */
    @PostConstruct
    public void registerGraphiteReporter() {
        try {

                final Graphite graphite = new Graphite(new InetSocketAddress("<url>", <port>));
                reporter = GraphiteReporter.forRegistry(metricsRegistry)
                                           .prefixedWith("service.testing")
                                           .convertRatesTo(TimeUnit.SECONDS)
                                           .convertDurationsTo(TimeUnit.SECONDS)
                                           .filter(new FilterMetrics()).build(graphite);
                reporter.start(30 , TimeUnit.SECONDS);

    }

    @PreDestroy
    public void destropMetricsContext() {

        if (reporter != null)
            reporter.stop();
    }


}

因此,当应用程序运行时,指标可以正常导出。

以下是控制器类

控制器类

@RestController
public class HelloController {

    @GetMapping("/hello")
    String hello() {
        return "hello";
    }
}

当我为这个Hello控制器运行测试时,在应用程序上下文加载时遇到异常,

测试类

@RunWith(SpringRunner.class)
@WebMvcTest(HelloController.class)
@ComponentScan({"com.metric.test"})
public class HelloControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void testMalformedRequest() throws Exception{
        System.err.println("");
    }

}

我收到以下异常

申请失败

说明

com.metric.test.manager.MetricsManager中的字段metricsRegistry需要一个类型为'com.codahale.metrics.MetricRegistry&#39;的bean。无法找到。

动作:

考虑定义类型为'com.codahale.metrics.MetricRegistry&#39;的bean。在你的配置中。

因此,当我创建配置类并将其定义为bean时,测试通过正常。

@Configuration
public class ServiceConfig {

    @Bean
    public MetricRegistry getMetricsRegistry(){
        return new MetricRegistry();
    }

}

我的问题是

请告诉我为什么只在运行junits时抛出异常?即使应用程序运行时自动布线工作正常,也无需在配置中进行定义。

0 个答案:

没有答案