2015-05-03 12 views
2

Я пытаюсь заполнить репозиторий с метрикой в ​​весенней загрузке, но у меня есть проблема, что при выполнении я получаю ошибку.error springboot @autowired dependency

Это моя ошибка:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'actuatorMetricsPrinter' defined in file [ActuatorMetricsPrinter.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [java.util.Collection]: : No qualifying bean of type [org.springframework.boot.actuate.endpoint.PublicMetrics] found for dependency [collection of org.springframework.boot.actuate.endpoint.PublicMetrics]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.boot.actuate.endpoint.PublicMetrics] found for dependency [collection of org.springframework.boot.actuate.endpoint.PublicMetrics]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {} 
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:747) 
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:185) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1115) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1018) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:706) 
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:762) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:109) 
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:691) 
at org.springframework.boot.SpringApplication.run(SpringApplication.java:320) 
at org.springframework.boot.SpringApplication.run(SpringApplication.java:952) 
at org.springframework.boot.SpringApplication.run(SpringApplication.java:941) 
at hello.Application.main(Application.java:14) 
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.boot.actuate.endpoint.PublicMetrics] found for dependency [collection of org.springframework.boot.actuate.endpoint.PublicMetrics]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {} 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1118) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:919) 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:862) 
at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:811) 
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:739) 
... 18 common frames omitted 

И это мой код, когда я Получать ошибку:

@Autowired 
public DummyController(ActuatorMetricsPrinter metricsPrinter) { 
    this.metricsPrinter = metricsPrinter; 
} 

У меня есть класс ActuatorMetricsPrinter, которые показывают метрики, но у меня есть проблема, когда заливка попытки это хранилище

* EDIT *

@Component 
public class ActuatorMetricsPrinter { 
private MetricRepository repository; 

private static final String TEMPLATE = "Metric: %s [%s]"; 
private Collection<PublicMetrics> publicMetrics = null; 

public String printAllMetrics() { 

    StringBuilder sb = new StringBuilder(); 

    for (PublicMetrics pm : publicMetrics) { 
     sb.append("Public Metric: " + pm.getClass().getName()); 
     sb.append("\n\n"); 

     for (Metric<?> m : pm.metrics()) { 
      sb.append(String.format(TEMPLATE, m.getName(), m.getValue().toString())); 
      sb.append("\n"); 
     } 
    } 

    return sb.toString(); 
} 

@Autowired 
public void MetricExporterService(MetricRepository repository) { 
    this.repository = repository; 
} 

И

@Controller 
public class DummyController { 

private final ActuatorMetricsPrinter metricsPrinter; 

@Autowired 
public DummyController(ActuatorMetricsPrinter metricsPrinter) { 
    this.metricsPrinter = metricsPrinter; 
} 

@RequestMapping(value = "/customMetrics", method = RequestMethod.GET) 
@ResponseBody 
public String printMetrics() { 
    return metricsPrinter.printAllMetrics(); 
} 

@Bean 
public ActuatorMetricsPrinter publicMetrics() { 
    return new ActuatorMetricsPrinter(); 
} 

} 

Большое спасибо!

+1

Настроена @Component аннотацию класса ActuatorMetricsPrinter и сконфигурированный путь сканирования весной? –

+0

@ChirdeepTomar Да, у меня есть компонент. То, что вы называете «настроенным путем сканирования», равно ComponenScan ??. У меня все в одном пакете – herzo

+0

Используете ли вы пружинный привод? –

ответ

0

В вашем случае фактическая проблема заключается в инициализации конструктора для ActuatorMetricsPrinter. У вас есть Autowired, чтобы взять коллекцию, поэтому Spring пытается найти набор компонентов PublicMetrics для использования в качестве коллекции и не может найти их. Ниже приведена ошибка в том, что вы указали выше. В какой-то момент я столкнулся с тем же вопросом.

No qualifying bean of type [org.springframework.boot.actuate.endpoint.PublicMetrics] found for dependency [collection of org.springframework.boot.actuate.endpoint.PublicMetrics]: expected at least 1 bean which qualifies as autowire candidate for this dependency.

От Spring Docs on Autowired:

In case of a Collection or Map dependency type, the container will autowire all beans matching the declared value type. In case of a Map, the keys must be declared as type String and will be resolved to the corresponding bean names.

Поскольку PublicMetrics не декларируются как фасоль я думаю, правильный способ сделать это с помощью автоматического связывания с MetricRepository. См. Раздел this link и раздел «Экспорт показателей» в качестве ссылки. Существует ссылка на пример приложения. Вот некоторые модифицированные коды, которые вы можете использовать.

@Autowired 
public MetricExporterService(MetricRepository repository) { 
    this.repository = repository; 
} 

public String printAllMetrics() { 

    StringBuilder sb = new StringBuilder(); 

    for (Metric metric : repository.findAll()) { 
     sb.append(String.format(TEMPLATE, metric.getName(), metric.getValue().toString())); 
    } 

    return sb.toString(); 
} 
+0

Я не знаю. Мне нужно добавить этот компонент. Но новый элемент создает PublicMetrics(), что это такое? – herzo

+0

Шахта была просто простым испытанием без всех реальных классов, которые вы использовали бы. Да, я считаю, что вам нужно будет создать beans для любого из объектов PublicMetrics, которые вы хотите включить в свою коллекцию в качестве AutoWired в своей конструкции. Я не совсем уверен, что это возможно, так как приставка Spring Boot не может выставлять их как фасоль. –

+0

Посмотрев на это немного больше, я думаю, что правильный способ сделать это - это автоподключение к MetricRepository. См. Http://kielczewski.eu/2015/01/application-metrics-with-spring-boot-actuator/ в качестве справки с образцом приложения. Дайте мне знать, если это сработает для вас. –