GraphQL を Spring Boot で試してみる 2

こちらの続き。今回は Mutation を試してみます。

GraphQL を Spring Boot で試してみる 1 - kntmr-blog

サンプルコードはこちら。

kntmr/playground - 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 を試してみようかと。