java - 使用 Spring Boot 和 application.yml 注入(inject) Map<String, Double>

标签 java spring spring-boot properties

我知道,有很多问题在 SO 中提出类似的问题,但我无法使用它们摆脱这种情况。

我有一个 Spring Boot 应用程序。

@SpringBootApplication
@EnableConfigurationProperties
public class Application implements ApplicationRunner {
    public static void main(String[] args) {
        SpringApplication.run(Application .class, args);
    }
}

然后我有以下类(class)。

@Component
@ConfigurationProperties(prefix = "somePrefix")
public class AClass {
    private final AnotherClass anotherClass;
    private final Map<String, Double> aMap;

    @Autowired
    public AffinityChecks(AnotherClass anotherClass,
                          Map<String, Double> aMap) {
        this.anotherClass = anotherClass;
        this.aMap = aMap;
    }

    // Omissis

最后我有以下 application.yml 配置文件。

somePrefix:
  aMap:
    key1: 0.6
    key2: 0.2
    key3: 0.2

我想要的只是 Spring 在构建过程中将映射注入(inject)到 AClass 类型的对象中。我得到的错误如下。

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'java.util.Map<java.lang.String, java.lang.Double>' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

这到底是怎么回事?

提前致谢。

最佳答案

Spring Boot 不支持绑定(bind)到环境的元素的构造函数注入(inject)。您当然可以按照通常的方式注入(inject)实际的bean。

您需要定义要绑定(bind)为常规 Javabean 属性的每个属性(即使用 getter/setter)。此规则有一个异常(exception): map 和非标量值(即嵌套内容)只需要一个 getter。

具体来说,如果AnotherClass是一个 bean 并且 FooClass一些具有嵌套属性的 pojo。

@Component
@ConfigurationProperties(prefix = "somePrefix")
public class AClass {
    private final AnotherClass anotherClass;
    private final Map<String, Double> aMap = new HashMap<>();
    private final FooClass foo = new FooClass();

    public AClass(AnotherClass anotherClass) { ...}

    public Map<String, Double> getaMap() { ... }

    public FooClass getFoo() { ... }

}

(请注意,getter 是推断属性名称的东西。在上面的示例中,如果 somePrefix.foo.xyz 上有 getXyz() ,则可以映射 FooClass )。

有一个例子in the documentation以及更多详细信息。

(您的代码错误的一个很好的提示是 map 不是 bean,因此 @Autowiring 不是您想要实现的目标的正确语义)。

关于java - 使用 Spring Boot 和 application.yml 注入(inject) Map<String, Double>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43889023/

相关文章:

Java 继承 : Restrict List to Subclass Objects

java - 在java中使用mongodb时出错

java - Python 中的多重继承;如何在 Java 中这样做?

java - @ControllerAdvice 异常处理程序方法未被调用

java - Spring Security Kerberos、Kerberos + AD - 错误 : Access Denied, 没有可存储的 key

java - Spring Boot 1.4 - 如何使用验证来测试 Controller

java - JPA中的双向关系

java - 如何在 Spring 中编写仅通过另一个 API 发送响应的 REST 端点?

spring-boot - 扩展 Spring 数据存储库

spring - @Document(collection = "Test") 在 MongoRepository 中不起作用 - Spring 数据 - mongodb