🌊

SpringBoot2.6でのConfigurationPropertiesのRecords対応

2021/09/10に公開

SpringBoot2.6から(執筆時点 v2.6.0-M2)、RecordsでConfigurationPropertiesを利用する場合の機能追加がありましたので備忘録的に記載しておきます。

何が変わったか

@ConfigurationPropertiesでクラスのフィールドにプロパティの値をセットする場合、以下のように@ConstructorBindingを指定する必要がありました。

@ConfigurationProperties("my.service")
@ConstructorBinding
public record MyProperties(boolean enabled, InetAddress remoteAddress) {
}

Recordsにはセッターは定義できないことから必ず@ConstructorBindingを指定する必要がありましたが、SpringBoot2.6からこれが不要となりました。

サンプル

というわけでサンプルコードを記載しておきます。

MyProperties.java
@ConfigurationProperties("my.service")
public record MyProperties(boolean enabled, InetAddress remoteAddress) {
}
MyController.java
@RestController
@RequestMapping("/")
public class MyController {
    private MyProperties myProperties;

    public MyController(MyProperties myProperties) {
        this.myProperties = myProperties;
    }

    @GetMapping
    public MyProperties index() {
        return myProperties;
    }
}
application.yml
my:
  service:
    enabled: true
    remote-address: 192.168.1.1
$ curl localhost:8080/
{"enabled":true,"remoteAddress":"192.168.1.1"}

参考

spring-boot issue
27216 @ConstructorBinding behavior by default for @ConfigurationProperties annotated records

Discussion