前言
一直使用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"
}
以上是常見的空安全內容。
可以看到,
- 注入對象的時候,可以根據需要來確定注入對象在程序運行配置期內,需不需要校驗,如果需要則發現空對象直接報錯,如果不需要,則在配置期內不報錯,運行期內報錯。
- 在請求參數校驗的時候,可以要求參數是否爲空,如果爲空則直接校驗失敗。
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)