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の内容は、以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | <?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のメインクラスの内容は、以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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データベースへの接続先を定義している。
1 2 3 4 5 6 7 8 | # ポート番号: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によってデータベースにアクセスしている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | 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; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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サービスを作成している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | 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アノテーションとなる。