こちらの続き。今回は Mutation を試してみます。
GraphQL を Spring Boot で試してみる 1 - kntmr-blog
サンプルコードはこちら。
kntmr/playground/graphql-spring-examples - GitHub
以下、備忘録。
schema / データクラス
スキーマに Mutation の IF を定義。引数に任意の型を指定する場合は input
を定義する。(命名規則が雑なのは許してください)
// ... (略) input _ToDo { content: String! completed: Boolean! userId: ID! } type Mutation { add(todo: _ToDo): [ToDo] }
尚、内部で Jackson を利用しており、データクラスは Jackson のお作法に従う必要がある模様。最初、input
に対応するデータクラスにデフォルトコンストラクタがなくて、API 呼び出し時に以下のエラーが発生。
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.example.demo.type._ToDo` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
Resolver
Mutation の場合は GraphQLMutationResolver
インタフェースを実装する。
@Component public class TodoMutationResolver implements GraphQLMutationResolver { private TodoDao todoDao; public TodoMutationResolver(TodoDao todoDao) { this.todoDao = todoDao; } public List<ToDo> add(_ToDo _todo) { List<ToDo> current = todoDao.findAll(); // XXX return todoDao.add(new ToDo(current.size(), _todo.getContent(), _todo.isCompleted(), _todo.getUserId())); } }
リクエスト
アプリを起動して、http://localhost:8080/graphiql
にアクセスする。以下の形式でリクエストする。更新するデータと併せて、レスポンスで返して欲しいフィールドを指定する。
mutation { add(todo: { content: "New content!" completed: false userId: 1 }) { id content completed } }
所感
今回は Mutation を試してみました。次回は Subscription を試してみようかと。