乐趣区

Kotlin之在Gradle中无参noarg编译器插件的使用

1、前言

最近在用 Kotlin+Spring Boot 写一个后端项目,实体类习惯性地用了 Kotlin 中的 data class,但是 Spring 要求要有一个无参的构造函数,否则可能会抛出java.sql.SQLDataException。要使data class 能够生成一个无参的构造函数,有两种方法可以做到:

1. 给 data class 的构造函数中的每一个参数都赋上默认值。比如:

data class User(@TableId(value = "id", type = IdType.AUTO)
    var id: Int?=-1,
    var userName: String?=null,  // 用户名
    var age: Int?=null,  // 年龄
    var password: String?=null,  // 密码
    var name: String?=null,  // 姓名
    var email: String?=null   // 邮箱
) : Serializable

2. 使用无参编译器插件no-arg。下面我们就来看看这种方法。

2、具体步骤

2.1 添加插件依赖

首先需要在工程的 build.gradle 中添加 no-arg 插件的依赖,版本跟 Kotlin 的版本一致:

plugins {
       ……
    id "org.jetbrains.kotlin.plugin.noarg" version "1.3.41"
}

我用的是 plugins 的形式,如果你使用的是 buildscript 块的话就可以这样添加:

buildscript {
    dependencies {classpath "org.jetbrains.kotlin:kotlin-noarg:1.3.41"}
}

apply plugin: "kotlin-noarg"

2.2 指定无参注解列表

说实话,在看官方文档时这一步并不好理解,这里只描述我经过自己的实践之后得出的经验。首先创建一个注解类,类名我们可以定为NoArg

annotation class NoArg

然后最关键一步来了,回到工程的 build.gradle 文件,添加无参注解列表:

noArg {annotation("com.lindroid.projectname.annotation.NoArg")
}

annotation中的路径就是我们创建的 NoArg 注解类所在的包目录。路径一定要写好,不要出错!此时无参插件就已经配置好了。我们可以在 data class 前面添加 @NoArg 注解,这样编译器就能为其生成一个无参构造函数。使用示例如下:

@NoArg
data class User(@TableId(value = "id", type = IdType.AUTO)
    var id: Int?,
    var userName: String?,  // 用户名
    var age: Int?,  // 年龄
    var password: String?,  // 密码
    var name: String?,  // 姓名
    var email: String?   // 邮箱
) : Serializable

2.3 kotlin-jpa 中的无参注解

如果你的项目中已经添加了 kotlin-jpa 插件,那么基本上就不必单独添加无参插件了。kotlin-jpa对无参插件做了包装,当你使用 @Entity @Embeddable @MappedSuperclass 这几个注解时,都会默认支持无参注解的。

3、参考文章

Kotlin 官方文档

退出移动版