Kotlin之在Gradle中无参(no-arg)编译器插件的使用详解

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官方文档

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android Kotlin的使用及简单实例

    Android Kotlin的使用及简单实例 写在前面的话,作为一个不熬夜的人,一觉醒来发现Kotlin成为了Android的官方语言,可谓是大喜过望.为了趁热打铁,我决定提前三天放出原定本周日Release的文章.希望能及时让大家了解一下Kotlin. 相信很多开发人员,尤其是Android开发者都会或多或少听说过Kotlin,当然如果没有听过或者不熟悉也没有关系.因为本篇文章以及博客后期的内容会涉及到很多关于Kotlin的知识分享. 在写这篇文章前的一个多月,Flipboard中国的Andr

  • Kotlin实现多函数接口的简化调用

    对于一个声明了多个方法的接口,我们使用的时候有时仅仅关注于几个关键方法,并不需要实现所有的.可是由于接口调用的语法限制,使得我们不得不在代码中也显示声明实现了那些我们不关心的方法.在Java中也有简化接口调用的方式,比如安卓中ViewPager监听页面切换时的接口PageChangeListener,官方提供了简单类: ViewPager.SimpleOnPageChangeListener来简化调用. 对于Kotlin来说,可以类似使用java的方式,来实现多函数接口的简化调用,只是要用到ob

  • Kotlin基础学习之位运算

    什么是位运算? 程序中的所有数在计算机内存中都是以二进制的形式储存的.位运算说穿了,就是直接对整数在内存中的二进制位进行操作.比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算.举个例子,6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理): 110 AND 1011 ---- 0010 –> 2 由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度

  • 详解Kotlin中如何实现类似Java或C#中的静态方法

    大家可以在网络上搜到不少这样的文章,官方推荐是包级函数,也有人说用伴生对象(companion class).这些都是不错的选择,但并不完善,我们在不同的情况下有更好的选择.我总结了几种方法,分别是:包级函数.伴生对象.扩展函数和对象声明.这需要大家根据不同的情况进行选择. 一.包级函数 Kotlin和Java及C#不同的是,可以在包里面直接声明函数.做法和类中是一样的,这里就不多说了,的确是一个非常好的选择.适用于函数不需要不包内部的类进行数据共享的方法. 二.伴生对象 从语义上来讲,伴生函数

  • Kotlin 基础教程之数组容器

    Kotlin 基础教程之数组容器 Arrays Kotlin 标准库提供了arrayOf()创建数组, **ArrayOf创建特定类型数组 val array = arrayOf(1, 2, 3) val countries = arrayOf("UK", "Germany", "Italy") val numbers = intArrayOf(10, 20, 30) val array1 = Array(10, { k -> k * k

  • 用Kotlin实现Android点击事件的方法

    近期,Google宣布Kotlin成为了Android一级开发语言.于是就刚刚简单的研究了一下,查资料的时候发现现成的资料还是很少的,于是决定自己记录一下,方便以后查看,也供其他人一个参考. 在android中,点击事件大致分为三种写法: 1. 匿名内部类. 2. Activity实现全局OnClickListener接口. 3. 指定xml的onClick属性. 今天用Kotlin实现这三种方式实现点击事件 匿名内部类:这种方式最简单 override fun onCreate(savedIn

  • Kotlin结合Rxjava+Retrofit实现极简网络请求的方法

    前言 因为最近正在写的项目集成了两个网络请求框架(Volley and Retrofit)对比之下也是选择了Retrofit.既然选择那自然要让自己以后开发更加省力(就是懒).于是我在Retrofit中加入了Rxjava,这也是当下蛮流行的一个请求框架.然后又利用了Kotlin的一些新特性,使网络请求变得特别简单,代码量特别少. Kotlin镇楼 RxJava RxJava学习是一个曲折漫长的过程,但一旦掌握,妙用无穷. 通过这里了解更多:http://www.jb51.net/article/

  • Kotlin实现静态方法

    工具类 全都是静态方法的情况 : class 类名 改为 object 类名 即可 package redwolf.com.moreimageupload import okhttp3.MultipartBody import java.io.File /** * @作者 RedWolf * @时间 2017/5/20 10:52 * @简介 MoreImageUtils.kt */ object MoreImageUtils { fun filesToMultipartBodyParts(fi

  • Kotlin编写Android适配器Adapter

    说好今天要写一个使用Kotlin写Adapter的列子,我想了半天也没有组织好语言,直接上代码吧,有一定Android基础的小伙伴肯定是能看的懂的 package com.example.administrator.kotlintest import android.content.Context import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import and

  • Kotlin之在Gradle中无参(no-arg)编译器插件的使用详解

    1.前言 最近在用Kotlin+Spring Boot写一个后端项目,实体类习惯性地用了Kotlin中的data class,但是Spring要求要有一个无参的构造函数,否则可能会抛出java.sql.SQLDataException.要使data class能够生成一个无参的构造函数,有两种方法可以做到: 1.给data class的构造函数中的每一个参数都赋上默认值.比如: data class User( @TableId(value = "id", type = IdType.

  • Kotlin中的惰性操作容器Sequence序列使用原理详解

    目录 Sequence序列 执行的顺序 只做最少的操作 序列可以是无限的 序列不会在每个步骤创建集合 Sequence的基本使用 序列的创建 序列的操作 Sequence源码分析 Sequence是什么? 序列的创建方式分析 序列的惰性原理 总结 Sequence序列 Sequence 是Kotlin标准库提供的一种容器类型.它和Iterable一样具备对集合进行多步骤操作能力,但是却是采用了一种完全不同于Iterable的实现方式: val map = (0..3).filter { prin

  • kotlin android extensions 插件实现示例详解

    目录 前言 原理浅析 总体结构 源码分析 插件入口 配置编译器插件传参 编译器插件接收参数 注册各种Extension IrGenerationExtension ExpressionCodegenExtension StorageComponentContainerContributor ClassBuilderInterceptorExtension PackageFragmentProviderExtension 总结 前言 kotlin-android-extensions 插件是 Ko

  • jQuery中的on与bind绑定事件区别实例详解

    on(events,[selector],[data],fn) events:一个或多个用空格分隔的事件类型和可选的命名空间,如"click"或"keydown.myPlugin" . selector:一个选择器字符串用于过滤器的触发事件的选择器元素的后代. data:当一个事件被触发时要传递event.data给事件处理函数. fn:该事件被触发时执行的函数. false 值也可以做一个函数的简写,返回false. bind(type,[data],fn) 为每

  • JS中call/apply、arguments、undefined/null方法详解

    a.call和apply方法详解 -------------------------------------------------------------------------------- call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指

  • 微信小程序中form 表单提交和取值实例详解

    微信小程序中form 表单提交和取值实例详解 我们知道,如果我们直接给 input 添加 bindinput,比如:<input bindinput="onUsernameInput" />,那么可以在 onUsernameInput 中直接使用 e.detail.value,即: onUsernameInput : function(e) { e.detail.value; } 但是,如果有多个输入控件,我们不可能为每个控件添加 bindinput.bindchange

  • vue中引用swiper轮播插件的教程详解

    有时候我们需要在vue中使用轮播组件,如果是在vue组件中引入第三方组件的话,最好通过npm安装,从而进行统一安装包管理. 申明:本文所使用的是vue.2x版本. 通过npm安装插件:  npm install swiper --save-dev 在需要使用swiper的组件里引入swiper,swiper的初始化放在mounted里 Slider.vue源码: <template> <div class="swiper-container"> <div

  • 如何在Spring Boot应用中优雅的使用Date和LocalDateTime的教程详解

    Java8已经发布很多年了,但是很多人在开发时仍然坚持使用着Date和SimpleDateFormat进行时间操作.SimpleDateFormat不是线程安全的,而Date处理时间很麻烦,所以Java8提供了LocalDateTime.LocalDate和LocalTime等全新的时间操作API.无论是Date还是LocalDate,在开发Spring Boot应用时经常需要在每个实体类的日期字段上加上@DateTimeFormat注解来接收前端传值与日期字段绑定,加上@JsonFormat注

  • Python中的None与 NULL(即空字符)的区别详解

    1.首先要了解Python的对象的概念: Python中,万物皆对象,所有的操作都是针对对象的,那什么是对象,5是一个int对象,'oblong'是一个str对象,异常也是一个对象,抽象一点是,人,猫,够也是一个对象 那对于一个对象,它就有包括两方面的特征:  属性:去描述它的特征  方法: 它所具有的行为 所以,对象=属性+方法 (其实方法也是一种属性,一种区别于数据属性的可调用属性 把具有相同属性和方法的对象就可以归为一类,即Classl.类就好比是一张蓝图,使用一个类可以创建多个对象实例

  • Vue3父子组件传参有关sync修饰符的用法详解

    目录 单向数据流讲解 Vue2.x使用 定义事件的形式, 通知父组件修改 .sync 和 update: 的使用 父传子, 传递多个数据的简写 采用v-model简写(要求严格) Vue3.x使用 普通用法 简写 单向数据流讲解 单向数据流(堆可以修改,栈不可修改) 我们都知道, 父传子的数据, 是单向数据流,即子组件不能直接修改, 父组件传递过来的值 但实际上, 对于修改值, 真正是:基本数据类型不可修改,复杂数据类型不要修改引用地址(栈),它的值可以随便修改 Vue2.x使用 定义事件的形式

随机推荐