跳至主要内容

將資料類別新增到 Spring Boot 專案

資訊

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


First step 使用 Kotlin 建立 Spring Boot 專案
Second step 將資料類別新增至 Spring Boot 專案
Third step 新增 Spring Boot 專案的資料庫支援
Fourth step 使用 Spring Data CrudRepository 進行資料庫存取

在本教學的這一部分,您將向應用程式新增更多功能,並探索更多 Kotlin 語言特性,例如資料類別 (data classes)。 它需要變更 MessageController 類別,以回應包含序列化物件集合的 JSON 文件。

更新您的應用程式

  1. 在同一個套件 (package) 中,建立一個 Message.kt 檔案,其中包含具有兩個屬性的資料類別:idtext

    // Message.kt
    package demo

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

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

    資料類別 – data class Message

Kotlin 中資料類別 (data classes)的主要目的是保存資料。此類類別標記有 data 關鍵字,並且某些標準功能和某些公用程式函式通常可以從類別結構中機械地推導出來。

在此範例中,您將 Message 宣告為資料類別,因為其主要目的是儲存資料。

val 和 var 屬性

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

  • 可變 (mutable),使用 var 關鍵字
  • 唯讀 (read-only),使用 val 關鍵字
  • Message 類別使用 val 關鍵字宣告了兩個屬性,idtext。 編譯器將自動為這兩個屬性產生 getter。 建立 Message 類別的實例後,將無法重新賦值這些屬性的值。

    可為空類型 – String?

    Kotlin 提供了 對可為空類型 (nullable types) 的內建支援。在 Kotlin 中,類型系統區分可以容納 null 的引用(可為空引用 (nullable references))和不能容納 null 的引用(不可為空引用 (non-nullable references))。
    例如,類型為 String 的常規變數不能容納 null。若要允許 null,您可以透過寫入 String? 將變數宣告為可為空的字串。

    Message 類別的 id 屬性這次宣告為可為空類型。 因此,可以透過傳遞 null 作為 id 的值來建立 Message 類別的實例:

    Message(null, "Hello!")
    1. MessageController.kt 檔案中,建立 listMessages() 函式,該函式會傳回 Message 物件的清單,而不是 index() 函式:

      // MessageController.kt
      package 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 標準函式庫提供了基本集合類型 (collection types) 的實作:集合 (sets)、清單 (lists) 和對應 (maps)。
    一對介面 (interfaces) 代表每種集合類型:

  • 一個唯讀 (read-only) 介面,提供用於存取集合元素的運算。
  • 一個可變 (mutable) 介面,透過寫入運算延伸相應的唯讀介面:新增、移除和更新其元素。
  • Kotlin 標準函式庫也提供了相應的工廠函式 (factory functions) 來建立此類集合的實例。

    在本教學中,您可以使用 listOf() 函式來建立 Message 物件的清單。 這是建立物件唯讀 (read-only) 清單的工廠函式:您無法從清單中新增或移除元素。
    如果需要在清單上執行寫入運算,請呼叫 mutableListOf() 函式以建立可變清單實例。

    尾隨逗號 (Trailing comma)

    尾隨逗號 (trailing comma) 是元素系列中最後一個項目之後的逗號符號:

    Message("3", "Privet!"),

    這是 Kotlin 語法的一個方便功能,並且完全是可選的 – 您的程式碼在沒有它們的情況下仍然可以運作。

    在上面的範例中,建立 Message 物件的清單包括最後一個 listOf() 函式引數之後的尾隨逗號。

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

    備註

    如果 Jackson 程式庫位於類別路徑 (classpath) 上,則 Spring 應用程式中的任何控制器 (controller) 預設都會呈現 JSON 回應。 由於您build.gradle.kts 檔案中指定了 spring-boot-starter-web 依賴項,因此您已收到 Jackson 作為傳遞性 (transitive) 依賴項。 因此,如果端點 (endpoint) 傳回可以序列化為 JSON 的資料結構,則應用程式會回應 JSON 文件。

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

    // DemoApplication.kt
    package demo

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

    @SpringBootApplication
    class DemoApplication

    fun main(args: Array<String>) {
    runApplication<DemoApplication>(*args)
    }
    // MessageController.kt
    package 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!"),
    )
    }
    // Message.kt
    package demo

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

    執行應用程式

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

    1. 再次執行應用程式。

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

      http://localhost:8080

      您將看到一個頁面,其中包含 JSON 格式的訊息集合:

      Run the application

    下一步

    在本教學的下一部分中,您將新增資料庫並將其設定到您的專案中,並發出 HTTP 請求。

    前往下一章