kotlin 开发spring boot 特性概述

前言

一直使用kotlin 在spring boot 框架下进行代码编写,在使用过程当中,总结了一些 kotlin 可以减少代码开发的场景。
暂时只写这么多,想起来了其他的再更新。

文章目录

  • 前言
    • 创建项目
      • 使用Initializr网站
      • 使用命令行
    • 空安全
    • WebFlux
    • JPA的持久性

创建项目

使用Initializr网站

访问https://start.spring.io并选择Kotlin语言。Gradle是Kotlin中最常用的构建工具,它提供了Kotlin DSL,在生成Kotlin项目时默认使用该DSL,因此这是推荐的选择。但是,如果您更喜欢Maven,也可以使用它。请注意,您可以使用https://start.spring.io/#!language=kotlin&type=gradle-project默认情况下选择Kotlin和Gradle。
kotlin 开发spring boot 特性概述_第1张图片

使用命令行

$ 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)

你可能感兴趣的:(kotlin,java,spring,spring,boot,kotlin,java,优化)