Spring Boot 2.7.0についてメモ

はじめに

先日、Bootの2.7が出ましたね。今回もまとめておこうと思います。ここでは私が気になるところについてまとめて、ものによっては簡単に動かしてみたいと思います。すべての変更点に関しては
そういえば昨年のSpring Oneの記憶なんですが、2.7.xは2系の最後のリリースになるんですかね。
2.5系のOSSサポートも終わったみたいですししっかり最新のバージョンについていって3系に挙げれるようにしたいですね。

諸々みてみる

環境

今回の動作環境

$ uname -srvmpio
Linux 5.14.0-1038-oem #42-Ubuntu SMP Thu May 19 05:03:08 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

$ lsb_release  -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.4 LTS
Release:    20.04
Codename:   focal


$ java --version
openjdk 18 2022-03-22
OpenJDK Runtime Environment (build 18+36-2087)
OpenJDK 64-Bit Server VM (build 18+36-2087, mixed mode, sharing)

$ mvn -v
Apache Maven 3.8.5 (3599d3414f046de2324203b78ddcf9b5e4388aa0)
Maven home: /home/hogehoge/.sdkman/candidates/maven/current
Java version: 18, vendor: Oracle Corporation, runtime: /home/yuyahirooka/.sdkman/candidates/java/18-open
Default locale: ja_JP, platform encoding: UTF-8
OS name: "linux", version: "5.14.0-1038-oem", arch: "amd64", family: "unix"

おおまかな変更点

  • InfoエンドポイントでJava Vendorの情報を取得可能に
  • @SpringBootTestのプロパティ優先度の変更
  • OkHttp4へ変更
  • Spring for GraphQL 1.0のオートコンフィグとメトリクスのサポート
  • Jackson Mixinsのサポート
  • PEM-encoded certsを利用したWeb server SSLの設定
  • Cloud Native Buildpacks利用時にPodmanが利用可能に
  • Cache2kのサポート
  • 依存のアップグレード

プロジェクトの作成

今回のプロジェクトはInitializrから以下の設定で作成しました。

各変更点のざっくりまとめ

それでは各変更点についてざっくりまとめていきます。

InfoエンドポイントでJava Vendorの情報を取得可能に

JavaInfoContributorが改善されて、Java Vendorの情報を取れるようになりました。
まずは/infoエンドポイントの公開とInfoContributorの有効化を行いましょう。 application.propertiesに以下の設定を追加します。

management.endpoints.web.exposure.include=info
management.info.java.enabled=true

cURL/infoえんどポイントにアクセスすると、以下のように情報はJasonのvendorオブジェクトのnameプロパティに含まれます。

$ cur -sl localhost:8080/actuator/info | jq .

{
  "java": {
    "version": "18",
    "vendor": {
      "name": "Oracle Corporation",
      "version": null
    },
    "runtime": {
      "name": "OpenJDK Runtime Environment",
      "version": "18+36-2087"
    },
    "jvm": {
      "name": "OpenJDK 64-Bit Server VM",
      "vendor": "Oracle Corporation",
      "version": "18+36-2087"
    }
  }
}

@SpringBootTestのプロパティ優先度の変更

@SpringBootTestもしくは、@TestPropertySourceで追加できるプロパティソースがコマンドラインの入力で追加できるプロパティソースの優先度より上になりました。
これらの両方を利用して設定を行っている場合は変更が必要かもしれません。

OkHttp4へ変更

OkHttp3のサポート終了により、2.7からはOkHTTP 4が利用されるようになりました。このアップグレードによりOkHttpの設定を行うプロパティもokhttp3.versionからokhttp.versionに変更されています。

Spring for GraphQL 1.0のオートコンフィグとメトリクスのサポート

2.7からSpring for GraphQLのstarterが用意されています。starterはspring-boot-starter-graphqlから利用できます。
ドキュメントによるとこのstarterを利用してWebで公開する場合以下のstarterのいずれかを追加で依存に入れてやる必要があります。

  • spring-boot-starter-web
  • spring-boot-starter-websocket
  • spring-boot-starter-webflux
  • spring-boot-starter-rsocket

より詳細な情報は各種設定に関してはこちらをご覧ください。

Jackson Mixinsのサポート

2.7からはJacsonMixinsがサポートされます。Jackson Mixinsを利用することでオブジェクトがJacksonに直接依存することなくシリアライズ/デシリアライズすることができます。Mixinの登録は@JsonMixinアノテーションが付与されたMixinの抽象クラスが自動的に発見され行われます。

例えば以下のようなレコードクラスを用意します。

User.java

public record User(String userId, String password) {}

このレコードクラスに対してMixinするための抽象クラスを用意します。
このクラスには@JsonMixinアノテーションを付与しタイプにシリアライズ/デシリアライズ対象のPOJOを指定します。
更にポイントはpasswordフィールドには@JsonIgnoreアノテーションを付与しプロパティを無視するようにします。

UserJacksonMixin.java

import com.fasterxml.jackson.annotation.JsonIgnore;
import org.springframework.boot.jackson.JsonMixin;

@JsonMixin(type = User.class)
abstract class UserJacksonMixin {
  
    String userId;
   
    @JsonIgnore
    String password;
}

このUserレコードクラスを/userのGETアクセスで取得できるようにハンドラーを追加します。

@SpringBootApplication
@RestController
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @GetMapping("/user")
    public User getUser(){
        return new User("henoheno", "password");
    }

}

cURLでリクエストを送ると以下のようにpasswordフィールドが無視されたJsonが取得できます。

$ curl -s localhost:8080/user | jq .
{
  "userId": "henoheno"
}

PEM-encoded certsを利用したWeb server SSLの設定

server.ssl.certificateserver.ssl.certificate-private-keyプロパティを設定することでPEM-eoncordedのSSLを設定できるようになりました。
設定方法やより詳細な情報はこちらをご確認ください。

Cloud Native Buildpacks利用時にPodmanが利用可能に

Mavenに以下の設定を追加することで、Cloud Native Buildpacks利用時にDocker Engineの代わりにPodmanをつかったビルドを行えるようになりました。

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <docker>
                        <host>unix:///run/user/1000/podman/podman.sock</host>
                        <bindHostToBuilder>true</bindHostToBuilder>
                    </docker>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Gradleでの設定はこちらをご確認ください。

Cache2kのサポート

Cache2kのオートコンフィグなどのサポートが入りました。設定はCache2kBuilderCustomizer beenを通して行うことができます。設定の詳細はこちら をご確認ください。