Spring Data Restを用いてCRUDおよびSwagger UIを作成する方法

Spring Data Restを用いてCRUDおよびSwagger UIを作成する方法をご紹介します。

条件

  • Spring Tool Suite 4
  • Spring Boot 2.5.0
  • h2
  • gradle

プロジェクトの作成

STSのパッケージエクスプローラーで、右クリック > 新規 > Spring スターター・プロジェクトを選択します。

名前に適当な値(ここではswaggerTest)を入力し、次へボタンを押します。

プロジェクトの依存関係で、以下を選択して完了ボタンを押します。

  • Spring Data JPA
  • H2 Database
  • Rest Repositories
  • Lombok

Lombokとは?

アノテーションを付加することで、getter/setter、toString、コンストラクタなどを自動生成してくれるライブラリです。

以下の記事に導入手順が記載されているので参考にして下さい。

Spring Data REST API(PostgreSQL)を作成する方法

依存関係(springdoc)

依存関係の追加

build.gradle

dependencyに以下を追加します。

  • implementation ‘org.springdoc:springdoc-openapi-ui:1.5.9’
  • implementation ‘org.springdoc:springdoc-openapi-data-rest:1.5.9’
plugins {
  id 'org.springframework.boot' version '2.5.0'
  id 'io.spring.dependency-management' version '1.0.11.RELEASE'
  id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

configurations {
  compileOnly {
    extendsFrom annotationProcessor
  }
}

repositories {
  mavenCentral()
}

dependencies {
  implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
  implementation 'org.springframework.boot:spring-boot-starter-data-rest'
  compileOnly 'org.projectlombok:lombok'
  runtimeOnly 'com.h2database:h2'
  annotationProcessor 'org.projectlombok:lombok'
  testImplementation 'org.springframework.boot:spring-boot-starter-test'
  implementation 'org.springdoc:springdoc-openapi-ui:1.5.9'
  implementation 'org.springdoc:springdoc-openapi-data-rest:1.5.9'
}

test {
  useJUnitPlatform()
}

依存関係の反映

build.gradleを右クリック > Gradle > Gradle プロジェクトのリフレッシュを選択します。

swagger関連のjarがプロジェクトの依存関係に追加されます。

ソース/設定ファイル等

設定ファイルの記述

application.properties

以下の内容を記述します。

Swagger UIを用いるとCRUD操作が出来てしまうため、リリース時には「false」を指定して使用できないようにします。

springdoc.swagger-ui.enabled=true

ソースの追加

modelパッケージの下に、Weatherというクラスを新規追加します。

Weather.java

package com.example.demo.model;

import java.sql.Timestamp;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

import lombok.Data;

@Data
@Entity
public class Weather {
  @Id
  @GeneratedValue
  private Integer id;
  
  private Integer location_id;
  
  private String name;
  
  private Integer temperature;
  
  private Integer humidity;
  
  private Timestamp date_time;
}

WeatherRepository.java

repositoryパッケージの下に、WeatherRepositoryというクラスを新規追加します。

インターフェースのみを定義します。

package com.example.demo.repository;

import org.springframework.data.rest.core.annotation.RepositoryRestResource;
import org.springframework.data.repository.PagingAndSortingRepository;
import com.example.demo.model.Weather;

@RepositoryRestResource
public interface WeatherRepository extends PagingAndSortingRepository<Weather, Integer> {
}

パッケージ構成

今回は以下のようなパッケージ構成としました。

実行

プロジェクトを右クリック > 実行 > Spring Bootアプリケーション を選択して実行します。

ブラウザで以下のURLにアクセスします。

http://localhost:8080/swagger-ui.html

Swaggerの画面が開き、CRUD処理(GET,POST,PUT,DELETE,PATCH)が作成されていることがわかります。

各種操作

データ一覧の取得

GETを展開し、Try it outボタンを押します。

Executeボタンを押します。

GETが実行され、レスポンスが返ってきます。
データが無いので、空(”weathers”: [])の結果となります。

データの追加

POSTを展開し、Try it outボタンを押します。

Request bodyに以下の値を設定し、Executeボタンを押します。

{
  "location_id": 12,
  "name": "名古屋",
  "temperature": 25,
  "humidity": 55,
  "date_time": "2021-06-05T02:05:38.722Z"
}

201 Createdというレスポンスが返り、登録に成功していることがわかります。

再度、データ一覧を取得すると、確かにデータが追加されていることが確認出来ます。

データの更新

先ほど追加したデータを更新します。

PUTを展開し、Try it outボタンを押します。

idには「1」を指定します。(先ほど追加したデータのIDが1であるため)

Request bodyには以下の値を設定し、Executeボタンを押します。

{
  "location_id": 12,
  "name": "名古屋(更新)",
  "temperature": 28,
  "humidity": 33,
  "date_time": "2021-06-05T02:11:22.112Z"
}

200 OKというレスポンスが返り、更新に成功していることがわかります。

再度、データ一覧を取得すると、確かにデータが更新されていることが確認出来ます。

データの削除

DELETEを展開し、Try it outボタンを押します。

idには「1」を指定します。(先ほど追加したデータのIDが1であるため)

EXECUTEボタンを押します。

204 No Contentというレスポンスが返り、削除に成功していることがわかります。

再度、データ一覧を取得すると、確かにデータが削除されていることが確認出来ます。

参考

springdoc-openapi v1.5.9:Getting Started

https://springdoc.org/#getting-started

springdoc-openapi v1.5.9:Spring Data Rest support

https://springdoc.org/#spring-data-rest-support

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です