🌿

Spring GraphQL 1.0.0-M2でアノテーションマッピングできるようになった

2021/09/02に公開

Spring GraphQL 1.0.0-M2がリリースされました。

アノテーションマッピングを試したりコードを読んだりしたのでメモしておきたいと思います。

このようなGraphQLスキーマがあったとします。

type Query {
  comics(genre: String!): [Comic!]!
}

type Comic {
  id: ID!
  title: String!
  author: Author!
}

type Author {
  id: ID!
  name: String!
}

これを次のようなコントローラーで表現できるようになりました。

package com.example;

import java.util.List;
import java.util.Optional;

import org.springframework.graphql.data.method.annotation.Argument;
import org.springframework.graphql.data.method.annotation.QueryMapping;
import org.springframework.graphql.data.method.annotation.SchemaMapping;
import org.springframework.stereotype.Controller;

@Controller
public class ComicController {

    private final ComicRepository comicRepository;
    private final AuthorRepository authorRepository;

    public ComicController(ComicRepository comicRepository, AuthorRepository authorRepository) {
        this.comicRepository = comicRepository;
        this.authorRepository = authorRepository;
    }

    @QueryMapping
    public List<Comic> comics(@Argument String genre) {
        return comicRepository.findByGenre(genre);
    }

    @SchemaMapping
    public Optional<Author> author(Comic source) {
        return authorRepository.findById(source.getAuthorId());
    }
}

mutation操作やsubscription操作にマッピングする@MutationMapping@SubscriptionMappingといったアノテーションも用意されています。

アノテーションを読み取ってDataFetcherを定義しているクラスはorg.springframework.graphql.data.method.annotation.support.AnnotatedDataFetcherConfigurerです。
AnnotatedDataFetcherConfigurerorg.springframework.graphql.boot.GraphQlWebMvcAutoConfiguration(あるいはorg.springframework.graphql.boot.GraphQlWebFluxAutoConfiguration)でコンポーネント定義されています。

引数を変換するのはorg.springframework.graphql.data.method.HandlerMethodArgumentResolverインターフェースです。
実装クラスのインスタンスはAnnotatedDataFetcherConfigurerafterPropertiesSetメソッドで準備されています。
今のところ独自の実装クラスは追加できそうにないです。

その他の気になった変更点

org.springframework.graphql.boot.RuntimeWiringBuilderCustomizerが削除されて、代わりにorg.springframework.graphql.execution.RuntimeWiringConfigurerが追加されました。

Discussion