Spring Bootアプリケーションでは、@RestControllerアノテーションを利用することで、Rest APIサービスを作成することができる。
Rest APIサービスについては、以下のサイトを参照のこと。
https://qiita.com/masato44gm/items/dffb8281536ad321fb08
今回は、STS(Spring Tool Suite)を利用したSpring Bootアプリケーション上で、特定のテーブルのデータ取得・追加・更新・削除を行うRest APIサービスを作成してみたので、そのサンプルプログラムを共有する。
前提条件
STSをインストールし、以下の記事のLombokの設定が終わっているものとする。
また、Oracleデータベース上に、以下のUSER_DATAテーブルとデータが作成済であること。

さらに、以下の記事のPostmanをインストール済であること。
サンプルプログラムの作成
今回はSTS(Spring Tool Suite)上で、Spring Bootアプリケーションを作成するところから開始する。その手順は、以下の通り。
1) STSを起動し、「ファイル」の「新規」メニューから「Spring スターター・プロジェクト」を選択する。

2) プロジェクト名やグループ・パッケージ等を指定し、「次へ」ボタンを押下する。

3) 必要なライブラリを選択し、「完了」ボタンを押下する。今回は、DevTools・Lombok・Spring Data JPA・Oracle Driver・Spring Webが必要なので、これらを選択している。

4) プロジェクトが作成でき、以下のようなフォルダ構成になる。

5) 作成されたプロジェクトの、pom.xmlの内容は、以下の通り。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example.demo</groupId>
<artifactId>demoRestApi</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demoRestApi</name>
<description>Demo Api Project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>6) 作成されたプロジェクトの、Spring Bootのメインクラスの内容は、以下の通り。
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoRestApiApplication {
public static void main(String[] args) {
SpringApplication.run(DemoRestApiApplication.class, args);
}
}7) 上記プロジェクトの内容に、以下の赤枠のソースコードを追加・変更する。

application.propertiesの内容は以下の通りで、Spring Bootアプリケーションを起動するポート番号と、Oracleデータベースへの接続先を定義している。
# ポート番号:8085で起動するよう設定 server.port = 8085 # Oracle DBの接続先を設定 spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe spring.datasource.username=USER01 spring.datasource.password=USER01 spring.datasource.driverClassName=oracle.jdbc.driver.OracleDriver
Oracleデータベース上のUSER_DATAテーブルにアクセスするエンティティ・リポジトリの内容は以下の通りで、JPAによってデータベースにアクセスしている。
package com.example.demo;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Column;
import javax.persistence.Id;
/**
* ユーザーデータテーブル(user_data)アクセス用エンティティ
*/
//テーブル名を「@Table」アノテーションで指定
@Entity
@Table(name="user_data")
@Data
public class UserData {
/** ID */
//主キー項目に「@Id」を付与
@Id
private long id;
/** 名前 */
private String name;
/** 生年月日_年 */
//カラム名を「@Column」アノテーションで指定
@Column(name="birth_year")
private int birthY;
/** 生年月日_月 */
@Column(name="birth_month")
private int birthM;
/** 生年月日_日 */
@Column(name="birth_day")
private int birthD;
/** 性別 */
private String sex;
/** メモ */
private String memo;
}package com.example.demo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
/**
* ユーザーデータテーブル(user_data)アクセス用リポジトリ
*/
// JpaRepositoryクラスを継承することによって、ユーザーデータテーブル(user_data)への
// select, insert, delete, updateを行うメソッドを自動で生成してくれる
@Repository
public interface UserDataRepository extends JpaRepository<UserData, Long> {
}RESTコントローラクラスの内容は以下の通りで、USER_DATAテーブルのデータ取得・追加・更新・削除を行うRest APIサービスを作成している。
package com.example.demo;
import java.util.List;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
/**
* Rest API定義クラス
*/
@RestController
public class DemoRestController {
/** ユーザーデータテーブル(user_data)アクセス用リポジトリ */
@Autowired
private UserDataRepository repository;
/**
* ユーザーデータリストを取得する.
* @return ユーザーデータリスト
*/
@GetMapping("/users")
public List<UserData> getAllUserData() {
return repository.findAll();
}
/**
* 指定したIDをもつユーザーデータを取得する.
* @param id ID
* @return 指定したIDをもつユーザーデータ
*/
@GetMapping("/users/{id}")
public UserData getOneUserData(@PathVariable long id) {
Optional<UserData> userData = repository.findById(id);
// 指定したIDをもつユーザーデータがあればそのユーザーデータを返す
if(userData.isPresent()) {
return userData.get();
}
// 指定したIDをもつユーザーデータがなければnullを返す
return null;
}
/**
* 指定したユーザーデータを登録する.
* @param userData ユーザーデータ
* @return 登録したユーザーデータ
*/
@PostMapping("/users")
public UserData saveUserData(@RequestBody UserData userData) {
// 本来は引数のチェック処理が必要であるが、ここでは実施していない
return repository.save(userData);
}
/**
* 指定したユーザーデータを更新する.
* @param id ID
* @param userData ユーザーデータ
* @return 更新したユーザーデータ
*/
@PutMapping("/users/{id}")
public UserData updateUserData(@PathVariable long id
, @RequestBody UserData userData) {
// 本来は引数userDataのチェック処理が必要であるが、ここでは実施していない
userData.setId(id);
return repository.save(userData);
}
/**
* 指定したIDをもつユーザーデータを削除する.
* @param id ID
*/
@DeleteMapping("/users/{id}")
public void deleteUserData(@PathVariable long id) {
Optional<UserData> userData = repository.findById(id);
// 指定したIDをもつユーザーデータがあればそのユーザーデータを削除する
if(userData.isPresent()) {
repository.deleteById(id);
}
}
} これらのソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/spring-boot-rest-api-crud/demoRestApi
サンプルプログラムの実行結果
サンプルプログラムの実行結果は、以下の通り。
1) Spring Bootアプリケーションを起動し、「http://(ホスト名):(ポート番号)/users」にアクセスすると、以下のように、USER_DATAテーブルの全データが取得できることが確認できる。

2) Postmanを起動し、リクエストを「GET」、URLを「http://(ホスト名):(ポート番号)/users」として「Send」ボタンを押下すると、先ほどと同じように、USER_DATAテーブルの全データが取得できることが確認できる。


3) Postmanで、リクエストを「GET」、URLを「http://(ホスト名):(ポート番号)/users/1」として「Send」ボタンを押下すると、USER_DATAテーブルのid=1のデータが取得できることが確認できる。


4) Postmanで、リクエストを「GET」、URLを「http://(ホスト名):(ポート番号)/users/10」として「Send」ボタンを押下すると、USER_DATAテーブルのid=10のデータが存在しないため、NULL値が返却されることが確認できる。


5) Postmanで、リクエストを「GET」、URLを「http://(ホスト名):(ポート番号)/users/a」として「Send」ボタンを押下すると、aは数値でないため、HTTP 400( Bad Request)エラーが返却されることが確認できる。


6) Postmanで、リクエストを「POST」、URLを「http://(ホスト名):(ポート番号)/users」、リクエストボディに追加するデータをJSON形式で設定して「Send」ボタンを押下すると、追加したデータが返却される。


7) 6)で追加されたデータをAPIやOracleデータベースで確認した結果は以下の通りで、指定したデータが追加されていることが確認できる。


8) Postmanで、リクエストを「PUT」、URLを「http://(ホスト名):(ポート番号)/users/4」、リクエストボディに更新するデータをJSON形式で設定して「Send」ボタンを押下すると、更新したデータが返却される。


9) 8)で更新されたデータをRest APIやOracleデータベースで確認した結果は以下の通りで、指定したデータが更新されていることが確認できる。


10) Postmanで、リクエストを「DELETE」、URLを「http://(ホスト名):(ポート番号)/users/4」、リクエストボディに更新するデータをJSON形式で設定して「Send」ボタンを押下すると、何もレスポンスは返却されないが処理が正常終了する。


11) 10)で削除されたデータをRest APIやOracleデータベースで確認した結果は以下の通りで、指定したidのデータが削除されていることが確認できる。


要点まとめ
- Spring Bootアプリケーションでは、@RestControllerアノテーションを利用することで、Rest APIサービスを作成することができる。
- Rest APIサービスの実行確認には、Postmanを利用すると便利である。
- Rest APIサービスの各メソッドに追加するアノテーションは、データ取得時は@GetMappingアノテーション、データ更新・追加時は@PostMappingアノテーション、データ削除時は@DeleteMappingアノテーションとなる。





