微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

@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

解决方法

回答我自己的问题。

上述错误是由于 Spring Boot 由于缺少无参数构造函数而无法构造 bean 引起的。记录隐式地为每个成员声明了一个带有参数的构造函数。

Spring Boot 允许我们使用 @ConstructorBinding 注释通过构造函数而不是 setter 方法启用属性绑定(如 the docsthis question 的答案中所述)。这也适用于记录,所以这是有效的:

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

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

@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));
    }
}

@Validatedjava.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));
    }
}

基于此Spring Boot issue

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。