Spring GraphQL 1.0.0-M2でアノテーションマッピングできるようになった
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です。
AnnotatedDataFetcherConfigurerはorg.springframework.graphql.boot.GraphQlWebMvcAutoConfiguration(あるいはorg.springframework.graphql.boot.GraphQlWebFluxAutoConfiguration)でコンポーネント定義されています。
引数を変換するのはorg.springframework.graphql.data.method.HandlerMethodArgumentResolverインターフェースです。
実装クラスのインスタンスはAnnotatedDataFetcherConfigurerのafterPropertiesSetメソッドで準備されています。
今のところ独自の実装クラスは追加できそうにないです。
その他の気になった変更点
org.springframework.graphql.boot.RuntimeWiringBuilderCustomizerが削除されて、代わりにorg.springframework.graphql.execution.RuntimeWiringConfigurerが追加されました。
Discussion