Featured image of post Spring Boot 2 + Gradleでマルチプロジェクト開発 API化編

Spring Boot 2 + Gradleでマルチプロジェクト開発 API化編

Spring Boot 2 + Gradleのマルチプロジェクトをrest APIとして動かすまで。build.gradleへの依存関係追加、GETリクエストにJSONを返す簡単なコントローラーの作成、devtoolsでのオートリロードの有効化まで♪

1254文字

土台は整ったのでAPIモジュールとして動かそう

前回の記事では、Eclipseプロジェクトとして読み込ませるところまでご紹介しました。

関連記事 【マイクロサービス】流行りのSpring Boot 2 + Gradle + Java8でマルチプロジェクトな個人開発をしていこう Eclipseプロジェクト化編【DDD(ドメイン駆動設計)】 2019/04/05 664文字 約2分で読めます IT Java Mac Windows アプリケーション

今回はAPIとして動かすような修正を入れていこうと思います。

手順

ライブラリを追加

APIを作成する際には、専用のライブラリが用意されているので、api/src/main/resources/build.gradleに以下の依存関係を追加しましょう。

api/src/main/resources/build.gradle
...
dependencies {
	implementation "org.springframework.boot:spring-boot-starter-web:${accountService.springBootVersion}" // 追加
}
...

あとは起動するだけで必要なライブラリをダウンロードした上でAPIシステムとしてサーバーが起動します。

sh bootrun.sh
> Task :api:bootRun

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.3.RELEASE)

2019-04-03 18:03:13.260  INFO 4373 --- [           main] t.b.service.account.AccountApplication   : Starting AccountApplication on xxx.xxx.xxx.xxx.static.zoot.jp with PID 4373 (/Users/blogenist/develop/git/github/service-account/api/build/classes/java/main started by blogenist in /Users/blogenist/develop/git/github/service-account/api)
2019-04-03 18:03:13.267  INFO 4373 --- [           main] t.b.service.account.AccountApplication   : The following profiles are active: common,local
2019-04-03 18:03:14.920  INFO 4373 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2019-04-03 18:03:14.965  INFO 4373 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-04-03 18:03:14.967  INFO 4373 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.16]
2019-04-03 18:03:14.984  INFO 4373 --- [           main] o.a.catalina.core.AprLifecycleListener   : The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [/Users/blogenist/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.]
2019-04-03 18:03:15.109  INFO 4373 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2019-04-03 18:03:15.110  INFO 4373 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1779 ms
2019-04-03 18:03:15.494  INFO 4373 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-04-03 18:03:15.800  INFO 4373 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2019-04-03 18:03:15.805  INFO 4373 --- [           main] t.b.service.account.AccountApplication   : Started AccountApplication in 3.318 seconds (JVM running for 3.763)
2019-04-03 18:03:49.453  INFO 4373 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2019-04-03 18:03:49.453  INFO 4373 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2019-04-03 18:03:49.459  INFO 4373 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 6 ms

簡単過ぎて神かよ。

試しにhttp://localhost:8080/ にアクセスしてみましょう。

SpringBootはこの辺のお手軽加減がたまりませんよね。。。!

簡単なコントローラーを作ってみる

では、実際にコントローラーを作ってみましょう。

今回はGETリクエストに対してレスポンスを返すミニマムなコントローラーを作ってみます。

tech.blogenist.service.account.api.controller.account.listing;
package tech.blogenist.service.account.api.controller.account.listing;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping( "/accounts" )
public class AccountListingController
{
	@GetMapping(path="/")
	public ResponseEntity<Object> listing()
    {
        List<Map<String,Object>> responseList = new ArrayList<>();

        Map<String, Object> taroMapData = new HashMap<>();
        taroMapData.put("id", 101);
        taroMapData.put("name", "Taro");
        taroMapData.put("age", 20);
        responseList.add(taroMapData);

        Map<String, Object> jiroMapData = new HashMap<>();
        taroMapData.put("id", 102);
        jiroMapData.put("name", "Jiro");
        jiroMapData.put("age", 18);
        responseList.add(jiroMapData);

        return ResponseEntity.of(Optional.of(responseList));
    }
}

この状態でサーバーを起動してhttp://localhost:8080/accounts/ にアクセスしましょう。
以下のようなJsonデータが表示されればOKです。

GET: http://localhost:8080/accounts/
[
    {
        "name": "Taro",
        "age": 20
    },
    {
        "name": "Jiro",
        "age": 18
    }
]

オートリロードを有効にする

サーバーを起動した状態でクラスファイル等を編集しても、自動で再読み込みされずに手動で再起動しないと反映されない状態になっています。

ですが、spring-boot-devtoolsを依存関係に追加することで、ファイルの変更を検知して自動で再起動してくれるようになります。
これはとても便利な機能なのでマストで有効化すべきです!

追加方法はとても簡単です。

追加方法はとても簡単で、api/build.gradleに以下を追記します。

api/build.gradle
dependencies {
	implementation "org.springframework.boot:spring-boot-starter-web:${accountService.springBootVersion}"
	implementation "org.springframework.boot:spring-boot-devtools:${accountService.springBootVersion}" // 追加
}

では、EclipseでAPIを起動したままファイル内容を変更してみましょう。

すると以下のように自動で再起動がかかり、変更が反映されるようになります。

これは非常に便利ですね♪

終わりに

以上のように依存関係を追加するだけで簡単にAPI化かつオートリロード化する事が出来ました。

次はレイヤー構造化をしていこうと思います。