【发布时间】:2016-01-29 03:35:20
【问题描述】:
我有一个 Spring Boot 应用程序 (1.3.1.RELEASE),最近在尝试将 @ConfigurationProperties bean 注入我的配置时遇到了一个奇怪的行为。我不是 Spring 方面的专家,所以我的问题是如何解释这种行为?
所以设置是这样的:
MyApplication.java:
package me.developer;
@SpringBootApplication
public class MyApplication {
public static void main(final String... args) {
SpringApplication.run(<..>, args);
}
}
SecurityProperties.java:
package me.developer.document.security;
@Setter
@Getter
@Component
@ConfigurationProperties(prefix = "security")
public class SecurityProperties {
private List<String> apiKeys = new ArrayList<>();
}
SecurityConfiguration.java
package me.developer.document;
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
private SecurityProperties securityProperties;
@Override
protected void configure(final HttpSecurity http) throws Exception {
<..>
}
}
当应用程序启动时,我收到一个错误,即 Spring 无法注入 SecurityConfiguration.securityProperties,因为它对 me.developer.document.security.SecurityProperties bean 一无所知.
但是如果我将SecurityProperties 重命名为SicurityProperties(第二个字母“e”-->“i”)- 它可以工作!不要问我是怎么做到的,但我只是好奇如何解释这种行为? IE。从我的角度来看,它应该工作或不工作,但不取决于 bean 名称等......
更新: 如果我不触摸类名但像这样明确指定 bean 名称,我也可以工作
package me.developer.document.security;
@Setter
@Getter
@Component("securityProperties.my")
@ConfigurationProperties(prefix = "security")
public class SecurityProperties {
private List<String> apiKeys = new ArrayList<>();
}
而且我在自动装配期间没有提供任何额外的限定符...为什么会这样?
【问题讨论】:
-
bean 名称必须与类名匹配,但第一个字母小写除外。例如 bean
securityProperties匹配类SecurityProperties。你可能有一些错字导致这种行为 -
不(问题是当类名与 bean 名不匹配时它可以工作。即
private SicurityProperties securityProperties。 -
你有xml文件还是属性文件
-
application.yml包含所有需要的东西。但即使不存在问题也不在于阅读它,而是在 Spring 中看不到@ConfigurationPropertiesbean...除非它重命名为 O_o -
检查你的
application.yml文件,如果你有关于securityProperties的配置,你应该确保它拼写正确。 Spring 中有一个序列来查找文件,并且可能会发生某些属性覆盖。
标签: java spring spring-boot