GraphQL Spring Bootの使い方
SpringBootとGraphQLを使って、MongoDBを使ってデータを保存する最もシンプルな追加、削除、変更、クエリーのインターフェースアプリケーションを作成します!
アプリケーションの作成
- 依存関係の追加
dependencies {
implementation('org.springframework.boot:spring-boot-starter-web')
implementation('org.springframework.boot:spring-boot-starter-data-mongodb')
compileOnly('org.projectlombok:lombok')
testImplementation('org.springframework.boot:spring-boot-starter-test')
}
ベースインターフェイスの追加
- モデルの追加
@Data
@Builder
@Document
@AllArgsConstructor
@NoArgsConstructor
public class Post {
@Id
private String id;
private String title;
private String content;
@CreatedDate
private Date createDate;
}
- リポジトリの追加
public interface PostRepository extends MongoRepository<Post, String> {
}
- 設定の追加
# MongoDB Config
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
#spring.data.mongodb.username=
#spring.data.mongodb.password=
spring.data.mongodb.database=graphql
- データ初期化の追加
@Component
@Slf4j
public class DataInitializer implements ApplicationRunner {
@Autowired
private PostRepository postRepository;
@Override
public void run(ApplicationArguments args) throws Exception {
List<Post> posts = initPost();
posts.forEach(post -> log.info("Post: {}", post));
}
private List<Post> initPost() {
postRepository.deleteAll();
return Stream.of("Post one", "Post two")
.map(title -> {
Post post = Post.builder()
.title(title)
.content("Content of " + title)
.build();
return postRepository.save(post);
})
.collect(Collectors.toList());
}
}
posts = initPost();
posts.forEach(post -> log.info(「Post: {}」, post));
}
private List initPost() {
postRepository.deleteAll();
return Stream.of(「Post one」, 「Post two」)
.map(title -> {
Post post = Post.builder()
.title(title)
.content(「Content of 」 + title)
.build();
return postRepository.save(post);
})
.collect(Collectors.toList());
}
} GraphQL設定の追加
- GraphQL依存関係の追加
implementation('com.graphql-java:graphql-spring-boot-starter:5.0.2');
implementation('com.graphql-java:graphiql-spring-boot-starter:5.0.2');
implementation('com.graphql-java:graphql-java-tools:5.2.4');- インターフェース定義スクリプトの追加
# io.github.helloworlde.graphql.model.Post 対応モデル
type Post {
id: ID,
title: String,
content: String,
createDate: String
}
# io.github.helloworlde.graphql.resolver.PostMutation.updatePost post
input PostInput{
title: String!,
content: String!
}
# io.github.helloworlde.graphql.resolver.PostQuery
type Query{
posts: [Post]
post(id: ID!): Post
}
# io.github.helloworlde.graphql.resolver.PostMutation
type Mutation{
createPost(post: PostInput): Post!
updatePost(id: ID!, post: PostInput): Post!
deletePost(id: ID!): String
}インターフェースリゾルバを追加する
- リゾルバの変更
@Component
public class PostQuery implements GraphQLQueryResolver {
@Autowired
private PostRepository postRepository;
public List<Post> posts() {
return postRepository.findAll();
}
public Optional<Post> post(String id) {
return postRepository.findById(id);
}
}
- リゾルバの変更
@Component
public class PostMutation implements GraphQLMutationResolver {
@Autowired
private PostRepository postRepository;
public Post createPost(Post post) {
Post newPost = Post.builder()
.title(post.getTitle())
.content(post.getContent())
.build();
return postRepository.save(newPost);
}
public Post updatePost(String id, Post post) throws Exception {
Post currentPost = postRepository.findById(id)
.orElseThrow();
currentPost.setTitle(post.getTitle());
currentPost.setContent(post.getContent());
return postRepository.save(currentPost);
}
public String deletePost(String id) throws Exception {
postRepository.findById(id)
.orElseThrow();
postRepository.deleteById(id);
return id;
}
}
テスト
アプリケーションの起動
<a href="http://localhost:8080" graphiql"="">"http://localhost:8080"/graphiql</a></p> をご覧ください。
クエリ
- クエリーリスト
{
posts {
id
title
content
createDate
}
}
{
"data": {
"posts": [
{
"id": "5c50245b7ed65eacb3372aba",
"title": "Post one",
"content": "Content of Post one",
"createDate": "Tue Jan 29 18:00:59 CST 2019"
},
{
"id": "5c50245b7ed65eacb3372abb",
"title": "Post two",
"content": "Content of Post two",
"createDate": "Tue Jan 29 18:00:59 CST 2019"
}
]
}
}
- 指定したidの取得
{
post(id: "5c50245b7ed65eacb3372aba") {
id
title
content
createDate
}
}
{
"data": {
"post": {
"id": "5c50245b7ed65eacb3372aba",
"title": "Post one",
"content": "Content of Post one",
"createDate": "Tue Jan 29 18:00:59 CST 2019"
}
}
}
修正する
- 追加
mutation {
createPost(post: {title: "New Posts", content: "New Post Content"}) {
id
title
content
createDate
}
}
{
"data": {
"createPost": {
"id": "5c5027197ed65eaf47a0854d",
"title": "New Posts",
"content": "New Post Content",
"createDate": "Tue Jan 29 18:12:41 CST 2019"
}
}
}
- 変更
mutation {
updatePost(id: "5c5027197ed65eaf47a0854d", post: {title: "Update Posts", content: "Update Post Content"}) {
id
title
content
createDate
}
}
{
"data": {
"updatePost": {
"id": "5c5027197ed65eaf47a0854d",
"title": "Update Posts",
"content": "Update Post Content",
"createDate": "Tue Jan 29 18:12:41 CST 2019"
}
}
}
- 削除
mutation {
deletePost(id: "5c5027197ed65eaf47a0854d")
}
{
"data": {
"deletePost": "5c5027197ed65eaf47a0854d"
}
}





