Home About Contact
Spring Boot , Kotlin

Spring Boot で JSON を返すウェブのエンドポイントをつくる

最終的には クライアント側は React で実装、サーバ側は Spring Boot で実装して JSON データをやり取りしようという算段です。 まずは、Spring Boot で JSON を返すエンドポイントをつくるところまでの覚え書き。

開発環境の確認:

$ java -version
openjdk version "17.0.5" 2022-10-18

では、ここ https://start.spring.io/ へアクセスして、 プロジェクトの雛形を取得します。

spring-boot-kotlin

もう面倒なのでパッケージなどはデフォルト設定のままです。 この設定でダウンロードすると、demo.zip が落ちてくるので、これを展開。

いきなりとりあえず bootRun してみます。

$ cd demo
$ ./gradlew bootRun

特にエラーはないのですが、そのまま終了してしまいます。 ウェブアプリをつくろうとしているので、ウェブサーバが起動してほしかったのですが。 調べてみると、ウェブアプリのために、 denpendencies に追加が必要とのこと。

たぶん、spring initializr で Jar ではなく War を選べという話のような気もする。

build.gradle

dependencies {
	//implementation 'org.springframework.boot:spring-boot-starter'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.jetbrains.kotlin:kotlin-reflect'
	implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

もともとセットされていた implementation 'org.springframework.boot:spring-boot-starter' をコメントアウトして、 implementation 'org.springframework.boot:spring-boot-starter-web' を追記しました。 もう一度 bootRun します。

$ ./gradlew bootRun

今度はコンソールに Tomcat initialized with port(s): 8080 (http) などと表示されてウェブサーバが起動したようです。 ブラウザで http://localhost:8080/ にアクセスすると 何やらエラーページが出ました。 まあ、まだ何もアプリケーションは書いていないのだから当然か、一応これでウェブサーバ起動はできている。 コンソールに戻り、 Ctrl+C でいったん終了して、アプリケーションを記述していきます。

src/main/kotlin/com/example/demo/Item.kt

package com.example.demo

data class Item(val name: String, val type: String)

src/main/kotlin/com/example/demo/ItemController.kt

package com.example.demo

import org.springframework.ui.Model
import org.springframework.web.bind.annotation.*

@RestController
@RequestMapping("items")
class ItemController {
    @GetMapping("")
    fun index(model: Model): List<Item> {
        return listOf(
            Item("Pikachu", "Electric"),
            Item("Eevee", "Normal"))
    }
}

@RestController の指定を忘れずに。
Model は使用する必要ない気がする。(が、試してはない。)

再び bootRun:

$ ./gradlew bootRun

ブラウザで http://localhost:8080/items にアクセスすると以下のように JSON が表示されました。

JSON

Item のリストをJSON形式で返すだけのコントローラが完成。