怠惰系エンジニアのメモ帳

勉強した内容をメモしていきます。解説ブログではないので悪しからず。

【SpringWebFlux】ServerRequest のボディをジェネリックな型に変換する

ServerRequest#bodyToMono メソッドを使用する。(Flux の場合はbodyToFlux

public Mono<ServerResponse> handle(final ServerRequest request){
    // プレーンな型に変換する場合
    Mono<Person> person = request.bodyToMono(Person.class);

    // ジェネリックな型に変換する場合
    // ParameterizedTypeReferenceを渡す
    Mono<List<Person>> persons = request.bodyToMono(new ParameterizedTypeReference<List<Person>>() {};)

    ...
}

また ParameterizedTypeReferenceインスタンス化にはファクトリメソッドを使用する方法もある。 ParameterizedTypeReference#forType がファクトリメソッドで、java.lang.reflact.Type を渡す。

// Typeの作成
final Type type = new ArrayList<String>().getClass().getGenericSuperclass();

// ParameterizedTypeReferenceを作成
final ParameterizedTypeReference<List<String>> ptr =  ParameterizedTypeReference.forType(type);

ParameterizedTypeReference は抽象クラスなので、匿名クラスとしてインスタンス化した方が楽そう。
あと、IDEが補完してくれるとは言え new ParameterizedTypeReference<T>(){} って長いよね。