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