使用kotlin集成springboot开发的超详细教程

目录

  • 一、安装支持插件
  • 二、maven配置 注意
  • 三、创建入口函数类
  • 四、编写入口函数
  • 五、创建数据库对象
  • 六、创建仓库操作接口
  • 七、创建一个业务接口来声明业务
  • 八、创建一个业务接口实现来实现声明的业务
  • 九、创建一个 http服务接口
目前大多数都在使用java集成 springboot进行开发,本文演示仅仅将 java换成 kotlin,其他不变的情况下进行开发。

一、安装支持插件 在 idea中安装 kotlin插件(大多数情况下会默认安装了)
使用kotlin集成springboot开发的超详细教程
文章图片


二、maven配置 注意 kotlin目前不支持 lombok所以不能使用或引用 lombok相关的插件或依赖包,下面是一个排除示例,同时也不支持 maven-enforcer-plugin
com.ayouran.commona-common1.0.0-SNAPSHOTorg.projectlomboklombok

maven的属性配置
UTF-8UTF-81.81.81.81.3.21trueenable2.2.4.RELEASEHoxton.SR12.7.0com.lc.github.KotlinDemoApplication4.2.11.3.1.Final

必要的依赖
org.jetbrains.kotlinkotlin-reflect${kotlin.version}org.jetbrains.kotlinkotlin-stdlib-jdk8${kotlin.version}

编译部分
org.jetbrains.kotlinkotlin-maven-plugintrue${kotlin.language.version}org.jetbrains.kotlinkotlin-maven-allopen${kotlin.version}kaptkapttruesrc/main/kotlinsrc/main/javacom.google.daggerdagger-compiler2.9com.querydslquerydsl-apt${querydsl.version}jpaorg.mapstructmapstruct-processor${mapstruct.version}compilecompilesrc/main/kotlinsrc/main/javatest-kapttest-kaptsrc/test/kotlinsrc/test/javacom.google.daggerdagger-compiler2.9com.querydslquerydsl-apt${querydsl.version}jpaorg.mapstructmapstruct-processor${mapstruct.version}test-compiletest-compilesrc/test/kotlinsrc/test/javatarget/generated-sources/kapt/testorg.apache.maven.pluginsmaven-compiler-plugin3.8.1none${java.version}${java.version}org.projectlomboklombok${lombok.version}org.mapstructmapstruct-processor${mapstruct.version}-Amapstruct.suppressGeneratorTimestamp=true-Amapstruct.defaultComponentModel=springdefault-compilenonedefault-testCompilenonejava-compilecompilecompilejava-test-compiletest-compiletestCompileorg.apache.maven.pluginsmaven-assembly-plugin2.6make-assemblypackagesingle${main.class}jar-with-dependencies

javakotlin混合的情况,在上面的 下加入下面的编译插件
org.apache.maven.pluginsmaven-compiler-plugin3.8.1none${java.version}${java.version}org.mapstructmapstruct-processor${mapstruct.version}-Amapstruct.suppressGeneratorTimestamp=true-Amapstruct.defaultComponentModel=springdefault-compilenonedefault-testCompilenonejava-compilecompilecompilejava-test-compiletest-compiletestCompile

maven配置集成了 querydslmapstructdagger2的编译,基本上能满足常规的使用

三、创建入口函数类 使用kotlin集成springboot开发的超详细教程
文章图片


四、编写入口函数 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-jparepository
@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开发内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    推荐阅读