如何将@ConfigurationProperties与记录一起使用?

2022-09-03 12:21:47

Java 16 引入了 Records,这有助于在编写携带不可变数据的类时减少样板代码。当我尝试使用记录作为bean,如下所示,我收到以下错误消息:@ConfigurationProperties

@ConfigurationProperties("demo")
public record MyConfigurationProperties(
        String myProperty
) {
}
***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of constructor in com.example.demo.MyConfigurationProperties required a bean of type 'java.lang.String' that could not be found.

如何使用记录作为?@ConfigurationProperties


答案 1

回答我自己的问题。

上述错误源于Spring Boot由于缺乏无参数构造函数而无法构造bean。记录隐式声明一个构造函数,每个成员都有一个参数。

Spring Boot允许我们使用注释来启用构造函数而不是setter方法的属性绑定(如文档这个问题的答案中所述)。这也适用于记录,因此这有效:@ConstructorBinding

@ConfigurationProperties("demo")
@ConstructorBinding
public record MyConfigurationProperties(
        String myProperty
) {
}

更新:从Spring Boot 2.6开始,使用记录是开箱即用的,当记录具有单个构造函数时,不再需要使用记录。请参阅发行说明@ConstructorBinding


答案 2

如果需要以编程方式声明默认值:

@ConfigurationProperties("demo")
public record MyConfigurationProperties(String myProperty) { 
    
    @ConstructorBinding
    public MyConfigurationProperties(String myProperty) {
        this.myProperty = Optional.ofNullable(myProperty).orElse("default");
    }
}

java.util.Optional性能:

@ConfigurationProperties("demo")
public record MyConfigurationProperties(Optional<String> myProperty) {

    @ConstructorBinding
    public MyConfigurationProperties(String myProperty) {
        this(Optional.ofNullable(myProperty));
    }
}

@Validated和组合:java.util.Optional

@Validated
@ConfigurationProperties("demo")
public record MyConfigurationProperties(@NotBlank String myRequiredProperty,
                                        Optional<String> myProperty) {

    @ConstructorBinding
    public MyConfigurationProperties(String myRequiredProperty, 
                                     String myProperty) {
        this(myRequiredProperty, Optional.ofNullable(myProperty));
    }
}

基于此春季启动问题


推荐