Skip to content

為 Spring Boot 專案新增 data class

這是 Spring Boot 與 Kotlin 入門教學的第二部分。在繼續之前,請確保您已完成先前的步驟:


第一步 使用 Kotlin 建立 Spring Boot 專案
第二步 為 Spring Boot 專案新增 data class
第三步 為 Spring Boot 專案新增資料庫支援
第四步 使用 Spring Data CrudRepository 存取資料庫

在此部分教學中,您將為應用程式新增更多功能,並探索更多 Kotlin 語言特性,例如 data class。 這需要修改 MessageController 類別,使其回傳包含序列化物件集合的 JSON 文件。

更新您的應用程式

  1. 在同一個套件中,於 DemoApplication.kt 檔案旁邊建立 Message.kt 檔案。

  2. Message.kt 檔案中,建立一個具有兩個屬性的 data class:idtext

    kotlin
    // Message.kt
    package com.example.demo
    
    data class Message(val id: String?, val text: String)

    Message 類別將用於資料傳輸:序列化的 Message 物件清單將構成控制器回應瀏覽器請求的 JSON 文件。

    Data classes – data class Message

    Kotlin 中 data class 的主要目的是持有資料。這類類別會標註 data 關鍵字,且通常可以從類別結構中機械地推導出一些標準功能和工具函式。

    在此範例中,您將 Message 宣告為 data class,因為它的主要目的是儲存資料。

    val 與 var 屬性

    Kotlin 類別中的屬性可以宣告為:

    • 可變,使用 var 關鍵字
    • 唯讀,使用 val 關鍵字

    Message 類別使用 val 關鍵字宣告了兩個屬性:idtext。 編譯器將自動為這兩個屬性產生 getter。 在 Message 類別的執行個體建立後,將無法重新指派這些屬性的值。

    可 null 型別 – String?

    Kotlin 提供對可 null 型別的內建支援。在 Kotlin 中,型別系統區分了可以持有 null 的參照(可 null 參照)與不能持有 null 的參照(不可 null 參照)。
    例如,String 型別的一般變數不能持有 null。若要允許 null,您可以透過撰寫 String? 將變數宣告為可 null 字串。

    這次將 Message 類別的 id 屬性宣告為可 null 型別。 因此,可以在建立 Message 類別的執行個體時將 null 作為 id 的值傳遞:

    kotlin
  3. MessageController.kt 檔案中,將 index() 函式替換為回傳 Message 物件清單的 listMessages() 函式:

    kotlin
    // MessageController.kt
    package com.example.demo
    
    import org.springframework.web.bind.annotation.GetMapping
    import org.springframework.web.bind.annotation.RequestMapping
    import org.springframework.web.bind.annotation.RestController
    
    @RestController
    @RequestMapping("/")
    class MessageController {
        @GetMapping
        fun listMessages() = listOf(
            Message("1", "Hello!"),
            Message("2", "Bonjour!"),
            Message("3", "Privet!"),
        )
    }
    集合 – listOf()

    Kotlin 標準函式庫提供了基本集合型別的實作:set、list 與 map。
    每種集合型別可以是唯讀可變的:

    • 唯讀集合提供存取集合元素的操作。
    • 可變集合還提供用於新增、移除與更新其元素的寫入操作。

    Kotlin 標準函式庫也提供了相應的工廠函式來建立這些集合的執行個體。

    在此教學中,您使用 listOf() 函式來建立一個 Message 物件清單。 這是建立唯讀物件清單的工廠函式:您無法從清單中新增或移除元素。
    如果需要對清單執行寫入操作,請呼叫 mutableListOf() 函式來建立可變清單執行個體。

    尾隨逗號

    尾隨逗號是指在一系列元素的最後一個項目之後的逗號符號:

    kotlin

    這是 Kotlin 語法的一項便利特性,且完全是選用的——即使沒有它們,您的程式碼仍可正常運作。

    在上述範例中,建立 Message 物件清單時,在最後一個 listOf() 函式引數後包含了尾隨逗號。

MessageController 的回應現在將是一個包含 Message 物件集合的 JSON 文件。

如果類別路徑中包含 Jackson 函式庫,Spring 應用程式中的任何控制器預設都會呈現 JSON 回應。 由於您build.gradle.kts 檔案中指定了 spring-boot-starter-webmvc 相依性,Jackson 會作為 遞移 相依性被引入。 因此,如果端點回傳一個可以序列化為 JSON 的資料結構,應用程式就會以 JSON 文件進行回應。

以下是 DemoApplication.ktMessageController.ktMessage.kt 檔案的完整程式碼:

kotlin
// DemoApplication.kt
package com.example.demo

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication

@SpringBootApplication
class DemoApplication

fun main(args: Array<String>) {
    runApplication<DemoApplication>(*args)
}
kotlin
// MessageController.kt
package com.example.demo

import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController

@RestController
@RequestMapping("/")
class MessageController {
    @GetMapping
    fun listMessages() = listOf(
        Message("1", "Hello!"),
        Message("2", "Bonjour!"),
        Message("3", "Privet!"),
    )
}
kotlin
// Message.kt
package com.example.demo

data class Message(val id: String?, val text: String)

執行應用程式

Spring 應用程式已準備好執行:

  1. 再次執行應用程式。

  2. 應用程式啟動後,開啟以下網址:

    text
    http://localhost:8080

    您將看到一個以 JSON 格式顯示訊息集合的頁面:

    執行應用程式

下一步

在教學的下一部分中,您將為專案新增並配置資料庫,並發送 HTTP 請求。

前往下一章節