【问题标题】:Spring: Injecting an external properties into java ConfigurationsSpring:将外部属性注入 java 配置
【发布时间】: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 中看不到 @ConfigurationProperties bean...除非它重命名为 O_o
  • 检查你的application.yml文件,如果你有关于securityProperties的配置,你应该确保它拼写正确。 Spring 中有一个序列来查找文件,并且可能会发生某些属性覆盖。

标签: java spring spring-boot


【解决方案1】:

假设您依赖于 spring-boot-starter-security,Spring Boot 将自动配置自己的 SecurityProperties bean,该 bean 也使用 @ConfigurationProperties 进行注释。不幸的是,这个 bean 将与您的 bean 具有相同的名称,因为类名(忽略包)是相同的。此名称冲突意味着 Spring Boot 将覆盖您的安全属性 bean。您应该会看到在启动期间记录的警告消息。

正如您所观察到的,更改 bean 的名称以便不再有名称冲突将解决问题。

【讨论】:

  • 是的,我终于做出了同样的决定......但从我的角度来看,Spring 可能在这方面更加冗长 - 你不能背诵它所有的内置 bean 来避免那样的情况。另一方面,明确地为您的 bean 提供肯定不会与 Spring 冲突的唯一名称可能是一个好主意。以防万一。
猜你喜欢
  • 2016-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-18
  • 1970-01-01
  • 2010-09-23
  • 2017-06-21
相关资源
最近更新 更多