【问题标题】:error springboot @autowired dependency错误springboot @autowired依赖
【发布时间】:2015-05-03 08:03:36
【问题描述】:

我尝试在 Spring Boot 中使用指标填充存储库,但我遇到的问题是,当我执行时收到错误消息。

这是我的错误:

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 类,但尝试填充此存储库时遇到问题

*编辑 *

@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();
}

}

非常感谢!

【问题讨论】:

  • 你是否在ActuatorMetricsPrinter类上设置了@Component注解并在spring中配置了扫描路径?
  • @ChirdeepTomar 是的,我有组件。你所说的“配置扫描路径”,它等于 ComponenScan??。我都在同一个包里
  • 您使用的是弹簧启动器吗?
  • @ChirdeepTomar 是的,我使用的是 spring boot Actuator
  • 你在maven或gradle文件中添加了Actuator依赖?

标签: spring spring-mvc spring-boot


【解决方案1】:

Spring beans factory 没有找到用于 autowarid 的 bean Collection&lt;PublicMetrics&gt; publicMetrics;尝试创建PublicMetrics的列表
见:
Spring autowire a list
Auto-wiring a List using util schema gives NoSuchBeanDefinitionException

【讨论】:

    【解决方案2】:

    在您的情况下,实际问题是初始化 ActuatorMetricsPrinter 的构造函数。你让它自动装配来接收一个集合,所以 Spring 试图找到一组 PublicMetrics bean 用作一个集合,但它找不到任何。这是您在上面提供的内容中指出的错误。我自己也曾遇到过同样的问题。

    没有符合条件的 bean 类型 [org.springframework.boot.actuate.endpoint.PublicMetrics] 找到 依赖[收集 org.springframework.boot.actuate.endpoint.PublicMetrics]:预计在 至少 1 个有资格作为自动装配候选者的 bean 依赖。

    来自Spring Docs on Autowired

    如果是 Collection 或 Map 依赖类型,容器将 自动装配与声明的值类型匹配的所有 bean。如果是地图, 键必须声明为 String 类型,并将解析为 对应的 bean 名称。

    由于 PublicMetrics 没有被声明为 bean,我认为正确的方法是自动装配到 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();
    }
    

    【讨论】:

    • 我不明白。我需要添加这个 bean。但是新元素创建 PublicMetrics() 是这样的吗??
    • 我的只是一个简单的测试,没有您将使用的所有实际类。是的,我相信您需要为要包含在您的集合中的任何 PublicMetrics 对象创建 bean,因为这些对象在您的构造中是 AutoWired。我不完全确定这是否可能,因为 Spring Boot Actuator 可能不会将这些公开为 bean。
    • 再看多一点,我认为正确的方法是自动装配到 MetricRepository。请参阅 kielczewski.eu/2015/01/… 作为示例应用程序的参考。让我知道这是否适合您。
    • 我更新了答案以反映上面的一些信息。我自己尝试过,我得到了与我创建的服务有关的任何指标,但我没有得到容器(Tomcat)或 JVM 指标之类的东西。那些是您要导出的吗?
    • 我在你的帮助下完成了这项工作。非常感谢!。但是我有一个问题,因为我想显示我使用执行器 /metrics 获得的系统指标,但是如果我通过 publicMetrics 类型更改此代码等于我把我收到 java 空指针。问题是什么??我编辑代码
    猜你喜欢
    • 1970-01-01
    • 2022-01-04
    • 2018-07-02
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 2019-01-10
    • 2014-12-13
    • 1970-01-01
    相关资源
    最近更新 更多