我知道,有很多问题在 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/