使用kotlin集成springboot开发的超详细教程
目录
- 一、安装支持插件
- 二、maven配置 注意
- 三、创建入口函数类
- 四、编写入口函数
- 五、创建数据库对象
- 六、创建仓库操作接口
- 七、创建一个业务接口来声明业务
- 八、创建一个业务接口实现来实现声明的业务
- 九、创建一个 http服务接口
springboot
进行开发,本文演示仅仅将 java
换成 kotlin
,其他不变的情况下进行开发。一、安装支持插件 在
idea
中安装 kotlin
插件(大多数情况下会默认安装了)文章图片
二、maven配置 注意
kotlin
目前不支持 lombok
所以不能使用或引用 lombok
相关的插件或依赖包,下面是一个排除示例,同时也不支持 maven-enforcer-plugin
com.ayouran.common a-common1.0.0-SNAPSHOT org.projectlombok lombok
maven
的属性配置UTF-8UTF-81.8 1.8 1.8 1.3.21 true enable 2.2.4.RELEASEHoxton.SR12.7.0com.lc.github.KotlinDemoApplication 4.2.1 1.3.1.Final
必要的依赖
org.jetbrains.kotlin kotlin-reflect${kotlin.version} org.jetbrains.kotlin kotlin-stdlib-jdk8${kotlin.version}
编译部分
org.jetbrains.kotlin kotlin-maven-plugintrue ${kotlin.language.version} org.jetbrains.kotlin kotlin-maven-allopen${kotlin.version} kapt kapt true src/main/kotlinsrc/main/javacom.google.dagger dagger-compiler2.9 com.querydsl querydsl-apt${querydsl.version} jpa org.mapstruct mapstruct-processor${mapstruct.version} compile compile src/main/kotlinsrc/main/java test-kapt test-kapt src/test/kotlinsrc/test/java com.google.dagger dagger-compiler2.9 com.querydsl querydsl-apt${querydsl.version} jpa org.mapstruct mapstruct-processor${mapstruct.version} test-compile test-compile src/test/kotlinsrc/test/javatarget/generated-sources/kapt/test org.apache.maven.plugins maven-compiler-plugin3.8.1 none${java.version} ${java.version} org.projectlombok lombok${lombok.version} org.mapstruct mapstruct-processor${mapstruct.version} -Amapstruct.suppressGeneratorTimestamp=true-Amapstruct.defaultComponentModel=spring default-compile nonedefault-testCompile nonejava-compile compilecompile java-test-compile test-compiletestCompile org.apache.maven.plugins maven-assembly-plugin2.6 make-assembly packagesingle ${main.class} jar-with-dependencies
有
java
与 kotlin
混合的情况,在上面的
下加入下面的编译插件org.apache.maven.plugins maven-compiler-plugin3.8.1 none${java.version} ${java.version} org.mapstruct mapstruct-processor${mapstruct.version} -Amapstruct.suppressGeneratorTimestamp=true-Amapstruct.defaultComponentModel=spring default-compile nonedefault-testCompile nonejava-compile compilecompile java-test-compile test-compiletestCompile
此
maven
配置集成了 querydsl
、mapstruct
、dagger2
的编译,基本上能满足常规的使用三、创建入口函数类
文章图片
四、编写入口函数
springboot
的启动方法及 swagger
的配置@EnableAsync@EnableSwagger2@EnableScheduling@SpringBootApplicationclass KotlinDemoApplication : CommandLineRunner {companion object {@JvmStaticfun main(args: Array) {SpringApplication.run(KotlinDemoApplication::class.java, *args)}}@Beanfun api(): Docket {return Docket(DocumentationType.SWAGGER_2).ignoredParameterTypes(Session::class.java).select()//.apis(RequestHandlerSelectors.any()).apis(RequestHandlerSelectors.basePackage("com.ayouran.flow.controllers")).paths(PathSelectors.any()).build().apiInfo(ApiInfoBuilder().description("ayouram-flow相关API").title("ayouram-flow").version("1.0").build()).pathMapping("/")}override fun run(vararg args: String?) {println("*************************** ok ***********************************")}}
五、创建数据库对象
import com.fasterxml.jackson.annotation.JsonFormatimport org.hibernate.annotations.DynamicInsertimport org.hibernate.annotations.DynamicUpdateimport java.util.*import javax.persistence.*/**** * 设备流量规则 */@Entity@Table(name = "device_rules",indexes = [Index(name = "device_no", columnList = "device_no"),Index(name = "rules_no", columnList = "rules_no"),Index(name = "deleted", columnList = "deleted")],uniqueConstraints = [UniqueConstraint(name = "device_no_rules_no", columnNames = ["device_no", "rules_no"])])@DynamicUpdate@DynamicInsertclass DeviceRules {@Id@Column(name = "id", columnDefinition = "bigint(20) COMMENT 'ID,自增'")@GeneratedValue(strategy = GenerationType.IDENTITY)var id: Long? = null@Column(name = "device_no", columnDefinition = "varchar(18) COMMENT '设备编号'")var deviceNo: String? = null@Column(name = "rules_no", columnDefinition = "varchar(18) COMMENT '规则编号'")var rulesNo: String? = null@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")@Column(name = "create_at", columnDefinition = "datetime COMMENT '创建时间'")var createAt: Date? = null@Column(name = "update_at", columnDefinition = "datetime COMMENT '修改时间'")var updateAt: Date? = null/*** 触发jpa update代码需要执行的逻辑*/@PreUpdatefun preUpdate() {updateAt = Date()}/*** 自动设置必要字段的值*/@PrePersistfun prePersist() {updateAt = Date()createAt = updateAtdeleted = BaseEnum.NOT_REMOVE.index}}
注解使用了
hibernate
的功能主要用于自动创建/更新表结构以及索引的生成,如果需要 mybatis
版本的,只需要去掉这里面的注释就好。六、创建仓库操作接口 基于
springboot-data-jpa
的 repository
@Repositoryinterface DeviceRulesRepository : JpaRepository,JpaSpecificationExecutor , QuerydslPredicateExecutor {fun getAllByDeviceNoAndDeleted(deviceNo: String, deleted: Int): Optional >}
七、创建一个业务接口来声明业务
interface DeviceService {/*** 查询设备的路由规则*/fun queryDeviceFlowRules(aPageRequest: APageRequest): PageResult}
八、创建一个业务接口实现来实现声明的业务
@Serviceclass DeviceServiceImpl @Autowiredconstructor(private val deviceRepository: DeviceRepository,private val deviceRulesRepository: DeviceRulesRepository,private val querydslUtlis: QuerydslUtlis,private val deviceMapstruct: DeviceMapstruct) : DeviceService {private val logger = LoggerFactory.getLogger(javaClass)override fun queryDeviceFlowRules(aPageRequest: APageRequest): PageResult{val qDeviceRules = QDeviceRules.deviceRulesval qFlowRules = QFlowRules.flowRulesvar rredicate: Predicate? = nullif (StringUtils.isNotBlank(aPageRequest.query)) rredicate = qDeviceRules.deviceNo.eq(aPageRequest.query)val exprs = arrayOf >(qDeviceRules.deviceNo, qDeviceRules.deleted, qFlowRules.rulesNo, qFlowRules.flowMax,qFlowRules.startTime, qFlowRules.endTime)val results = querydslUtlis.getQueryFactory().select(*exprs).from(qDeviceRules).where(ExpressionUtils.allOf(rredicate)).leftJoin(qFlowRules).on(qDeviceRules.rulesNo.eq(qFlowRules.rulesNo)).orderBy(qDeviceRules.createAt.desc()).offset((aPageRequest.pageIndex!! - 1) * aPageRequest.pageSize!!).limit(aPageRequest.pageSize!!).fetchResults()return PageUtlis.retPage(results, querydslUtlis.getCollection(results.results, exprs, QueryDeviceFlowRulesVO::class.java) as Collection )}}
这里使用了
querydsl
来完成一个多表查询九、创建一个 http服务接口
@RestWrapper@RestController@RequestMapping("/device")@Api(value = "https://www.it610.com/article/device", description = "设备相关接口", tags = ["device"])class DeviceController @Autowiredconstructor(private val deviceService: DeviceService) {@GetMapping("/query_device")fun queryDevice(aPageRequest: APageRequest) = deviceService.queryDevice(aPageRequest)@GetMapping("/query_device_flow_rules")fun queryDeviceFlowRules(aPageRequest: APageRequest) = deviceService.queryDeviceFlowRules(aPageRequest)}
至此完成一个基本的开发过程,大多数情况下可以直接将
java
代码粘贴到 kotlin
文件中,会自动转换成合适的 kotlin
代码(偶尔需要自己调整,毕竟编辑器不是万能的)【使用kotlin集成springboot开发的超详细教程】到此这篇关于使用kotlin集成springboot开发的文章就介绍到这了,更多相关kotlin集成springboot开发内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- Activiti(一)SpringBoot2集成Activiti6
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- iOS中的Block
- Linux下面如何查看tomcat已经使用多少线程
- 使用composer自动加载类文件
- android|android studio中ndk的使用