@ConfigurationProperties构造函数绑定在2.2.0.RC1中不起作用

时间:2019-10-06 16:12:42

标签: java spring-boot

我正在尝试新的Spring Boot 2.2.0.RC1版本,特别是2.8.2节中描述的新配置属性构造函数绑定功能。构造函数绑定。我用这样的类建立了一个非常小的项目:

@Configuration
@ConfigurationProperties("acme")
public class AppConfig {
    private final String stuff;

    public AppConfig(String stuff) {
        this.stuff = stuff;
    }

    public String getStuff() {
        return stuff;
    }
}

和像这样的application.yml:

server:
  port: 9000

acme:
  stuff: hello there

我的主要方法在此类中:

@SpringBootApplication
public class AcmeApplication {

    public static void main(String[] args) {
        new SpringApplicationBuilder(AcmeApplication.class)
                .logStartupInfo(true)
                .bannerMode(Banner.Mode.CONSOLE)
                .web(WebApplicationType.SERVLET)
                .run();
    }
}

运行应用程序的结果是以下输出:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of constructor in com.acme.config.AppConfig required a bean of type 'java.lang.String
' that could not be found.


Action:

Consider defining a bean of type 'java.lang.String' in your configuration.

有趣的是,如果我更改AppConfig类中的代码以使用属性绑定,则通过删除构造函数,从“填充”字段中删除“最终”修饰符并添加setStuff(String)方法,应用程序将正常启动( setStuff方法将按预期方式调用。)

在尝试使构造函数绑定生效时我缺少了什么?我试过删除@Configuration批注,添加@EnableConfigurationProperties批注,添加@ConfigurationPropertiesScan等,但是从阅读文档开始,这些东西似乎都不适用于此。在我看来,它正在尝试注入Spring Bean,而不是构建和注入配置属性对象。这就是为什么我认为删除@Configuration注释会有所帮助的原因,但这没有什么区别。顺便说一句,我希望这个AppConfig是一个Spring Bean,因此我可以将其注入Service类。

2 个答案:

答案 0 :(得分:0)

进行了简短的研究。这似乎是https://github.com/spring-projects/spring-boot/issues/16928#issuecomment-494717209的原因 请查看整个线程以获取更多上下文。 这是先前https://github.com/spring-projects/spring-boot/issues/8762#issuecomment-494310988

中提到的问题描述

答案 1 :(得分:0)

我错误地查看了里程碑文档。更新的RC1文档显示我需要使用@ImmutableConfigurationProperties批注以及@ConfigurationPropertiesScan批注。

另请参阅:https://github.com/spring-projects/spring-boot/issues/18543