kotlin 開發spring boot 特性概述

前言

一直使用kotlin 在spring boot 框架下進行代碼編寫,在使用過程當中,總結了一些 kotlin 可以減少代碼開發的場景。
暫時只寫這麼多,想起來了其他的再更新。

創建項目

使用Initializr網站

訪問https://start.spring.io並選擇Kotlin語言。Gradle是Kotlin中最常用的構建工具,它提供了Kotlin DSL,在生成Kotlin項目時默認使用該DSL,因此這是推薦的選擇。但是,如果您更喜歡Maven,也可以使用它。請注意,您可以使用https://start.spring.io/#!language=kotlin&type=gradle-project默認情況下選擇Kotlin和Gradle。
在這裏插入圖片描述

使用命令行

$ mkdir blog && cd blog
$ curl https://start.spring.io/starter.zip -d language=kotlin -d style=web,mustache,jpa,h2,devtools -d packageName=com.example.blog -d name=Blog -d type=gradle-project -o blog.zip

空安全

kotlin 在Java 基礎上完成的最大也是最可靠的改造就是空安全。針對Java常見的NullPointException問題,進行了空安全處理。

var str:String = "" //這樣沒問題
var str1:String = null //這樣編譯器會報錯
var str2:String? = null //這樣沒問題

看懂了空安全,那spring boot 框架下,哪些地方可以簡化代碼呢?

@Autowire
private lateinit var testService:TestService

@Autowire
private lateinit var testNullService:TestNullService?

@GetMapping("/testParams")
fun testParams(name: String , age: String?):String{
    // name 必填 , age 選填
    return "test"
}

以上是常見的空安全內容。

可以看到,

  1. 注入對象的時候,可以根據需要來確定注入對象在程序運行配置期內,需不需要校驗,如果需要則發現空對象直接報錯,如果不需要,則在配置期內不報錯,運行期內報錯。
  2. 在請求參數校驗的時候,可以要求參數是否爲空,如果爲空則直接校驗失敗。

WebFlux

最近比較火的webFlux 框架,在服務端開發時,可以使用kotlin 進行路由優化。

router {
    ("/test" and accept(TEXT_HTML)).nest {
        GET("/", testHandler::findAllView)
        GET("/{report}", testHandler::findOneView)
    }
    ("/api/test" and accept(APPLICATION_JSON)).nest {
        GET("/", apiHandler::findAll)
        GET("/{id}", apiHandler::findOne)
    }
}

JPA的持久性

關於Data class 在 kotlin 中沒問題,但是 在spring 中 JPA使用時,需要增加 open 描述符的情況,可以通過以下配置將JPA相關的Data class 進行編譯添加open處理,不需要手工添加open描述符。

plugins {
  kotlin("plugin.allopen") version "1.3.61"
}

allOpen {
  annotation("javax.persistence.Entity")
  annotation("javax.persistence.Embeddable")
  annotation("javax.persistence.MappedSuperclass")
}
@Entity
class Article(
    var title: String,
    var headline: String,
    var content: String,
    @ManyToOne var author: User,
    var slug: String = title.toSlug(),
    var addedAt: LocalDateTime = LocalDateTime.now(),
    @Id @GeneratedValue var id: Long? = null)

@Entity
class User(
    var login: String,
    var firstname: String,
    var lastname: String,
    var description: String? = null,
    @Id @GeneratedValue var id: Long? = null)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章