跳到主要内容

向 Spring Boot 项目添加数据类

信息

这是 Spring Boot 和 Kotlin 入门教程的第二部分。在继续之前,请确保已完成之前的步骤:


First step 使用 Kotlin 创建一个 Spring Boot 项目
Second step 向 Spring Boot 项目添加一个数据类(data class)
Third step 为 Spring Boot 项目添加数据库支持
Fourth step 使用 Spring Data CrudRepository 进行数据库访问

在本教程的这一部分中,你将向应用程序添加更多功能,并探索更多 Kotlin 语言特性,例如数据类(data class)。 这需要更改 MessageController 类,使其响应包含序列化对象集合的 JSON 文档。

更新你的应用

  1. 在同一个包(package)中,创建一个 Message.kt 文件,其中包含一个具有两个属性的数据类(data class):idtext

    // Message.kt
    package demo

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

    Message 类将用于数据传输:序列化的 Message 对象列表将构成控制器(controller)将响应浏览器请求的 JSON 文档。

    数据类(Data classes)– data class Message

Kotlin 中数据类(data classes)的主要目的是保存数据。此类用 data 关键字标记,并且一些标准功能和一些实用函数通常可以从类结构中机械地导出。

在此示例中,你已将 Message 声明为数据类(data class),因为其主要目的是存储数据。

val 和 var 属性(properties)

Kotlin 类中的属性(properties)可以声明为:

  • 可变的(mutable),使用 var 关键字
  • 只读的(read-only),使用 val 关键字
  • Message 类使用 val 关键字声明了两个属性(properties),即 idtext。 编译器将自动为这两个属性(properties)生成 getter。 创建 Message 类的实例后,将无法重新分配这些属性(properties)的值。

    可空类型(Nullable types)– String?

    Kotlin 提供了对可空类型(nullable types)的内置支持。在 Kotlin 中,类型系统区分可以包含 null 的引用(可空引用(nullable references))和不能包含 null 的引用(非空引用(non-nullable references))。
    例如,String 类型的常规变量不能包含 null。要允许空值(nulls),你可以通过编写 String? 将变量声明为可空字符串。

    Message 类的 id 属性(property)这次声明为可空类型(nullable type)。 因此,可以通过传递 null 作为 id 的值来创建 Message 类的实例:

    Message(null, "Hello!")
    1. MessageController.kt 文件中,创建返回 Message 对象列表的 listMessages() 函数,而不是 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!"),
      )
      }

    集合(Collections)– listOf()

    Kotlin 标准库提供了基本集合类型(collection types)的实现:集(sets)、列表(lists)和映射(maps)。
    一对接口表示每种集合类型(collection type):

  • 一个只读(read-only)接口,提供用于访问集合元素的操作。
  • 一个可变的(mutable)接口,通过写入操作(添加、删除和更新其元素)扩展了相应的只读(read-only)接口。
  • Kotlin 标准库还提供了相应的工厂函数(factory functions)来创建此类集合的实例。

    在本教程中,你使用listOf() 函数来创建 Message 对象列表。 这是创建对象只读(read-only)列表的工厂函数(factory function):你无法从列表中添加或删除元素。
    如果需要在列表上执行写入操作,请调用mutableListOf() 函数来创建可变列表实例。

    尾随逗号(Trailing comma)

    尾随逗号(trailing comma)是元素系列中最后一项之后的逗号符号:

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

    这是 Kotlin 语法的一个方便特性,并且是完全可选的 - 没有它们你的代码仍然可以工作。

    在上面的示例中,创建 Message 对象列表包括最后一个 listOf() 函数参数之后的尾随逗号(trailing comma)。

    现在,来自 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 请求。

    继续下一章