今天我们尝试Spring Boot整合Kotlin,并决定建立一个非常简单的Spring Boot微服务,使用Kotlin作为编程语言进行编码构建。
  
  创建一个简单的Spring Boot应用程序。我会在这里使用maven构建项目:
  
  <?xml version="1.0" encoding="UTF-8"?>
  
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  
  <modelVersion>4.0.0</modelVersion>
  
  <groupId>com.edurt.ski</groupId>
  
  <artifactId>springboot-kotlin-integration</artifactId>
  
  <version>1.0.0</version>
  
  <packaging>jar</packaging>
  
  <name>springboot kotlin integration</name>
  
  <description>SpringBoot Kotlin Integration is a open source springboot, kotlin integration example.</description>
  
  <parent>
  
  <groupId>org.springframework.boot</groupId>
  
  <artifactId>spring-boot-starter-parent</artifactId>
  
  <version>2.1.3.RELEASE</version>
  
  <relativePath/> <!-- lookup parent from repository -->
  
  </parent>
  
  <properties>
  
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  
  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  
  <java.version>1.8</java.version>
  
  <!-- plugin config -->
  
  <plugin.maven.kotlin.version>1.2.71</plugin.maven.kotlin.version>
  
  </properties>
  
  <dependencies>
  
  <!-- spring boot -->
  
  <dependency>
  
  <groupId>org.springframework.boot</groupId>
  
  <artifactId>spring-boot-starter-web</artifactId>
  
  </dependency>
  
  <!-- kotlin -->
  
  <dependency>
  
  <groupId>com.fasterxml.jackson.module</groupId>
  
  <artifactId>jackson-module-kotlin</artifactId>
  
  </dependency>
  
  <dependency>
  
  <groupId>org.jetbrains.kotlin</groupId>
  
  <artifactId>kotlin-stdlib-jdk8</artifactId>
  
  </dependency>
  
  <dependency>
  
  <groupId>org.jetbrains.kotlin</groupId>
  
  <artifactId>kotlin-reflect</artifactId>
  
  </dependency>
  
  </dependencies>
  
  <build>
  
  <sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
  
  <testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory>
  
  <plugins>
  
  <plugin>
  
  <groupId>org.springframework.boot</groupId>
  
  <artifactId>spring-boot-maven-plugin</artifactId>
  
  </plugin>
  
  <plugin>
  
  <artifactId>kotlin-maven-plugin</artifactId>
  
  <groupId>org.jetbrains.kotlin</groupId>
  
  <configuration>
  
  <args>
  
  <arg>-Xjsr305=strict</arg>
  
  </args>
  
  <compilerPlugins>
  
  <plugin>spring</plugin>
  
  <plugin>jpa</plugin>
  
  <plugin>all-open</plugin>
  
  </compilerPlugins>
  
  <pluginOptions>
  
  <option>all-open:annotation=javax.persistence.Entity</option>
  
  </pluginOptions>
  
  </configuration>
  
  <dependencies>
  
  <dependency>
  
  <groupId>org.jetbrains.kotlin</groupId>
  
  <artifactId>kotlin-maven-allopen</artifactId>
  
  <version>${plugin.maven.kotlin.version}</version>
  
  </dependency>
  
  <dependency>
  
  <groupId>org.jetbrains.kotlin</groupId>
  
  <artifactId>kotlin-maven-noarg</artifactId>
  
  <version>${plugin.maven.kotlin.version}</version>
  
  </dependency>
  
  </dependencies>
  
  <executions>
  
  <execution>
  
  <id>kapt</id>
  
  <goals>
  
  <goal>kapt</goal>
  
  </goals>
  
  <configuration>
  
  <sourceDirs>
  
  <sourceDir>src/main/kotlin</sourceDir>
  
  </sourceDirs>
  
  <annotationProcessorPaths>
  
  <annotationProcessorPath>
  
  <groupId>org.springframework.boot</groupId>
  
  <artifactId>spring-boot-configuration-processor</artifactId>
  
  <version>${project.parent.version}</version>
  
  </annotationProcessorPath>
  
  </annotationProcessorPaths>
  
  </configuration>
  
  </execution>
  
  </executions>
  
  </plugin>
  
  </plugins>
  
  </build>
  
  </project>
  
  添加所有必需的依赖项:
  
  kotlin-stdlib-jdk8 kotlin jdk8的lib包
  
  kotlin-reflect kotlin反射包
  
  一个简单的应用类:
  
  package com.edurt.ski
  
  import org.springframework.boot.autoconfigure.SpringBootApplication
  
  import org.springframework.boot.runApplication
  
  @SpringBootApplication
  
  class SpringBootKotlinIntegration
  
  fun main(args: Array<String>) {
  
  runApplication<SpringBootKotlinIntegration>(*args)
  
  }
  
  添加Rest API接口功能
  
  创建一个HelloController Rest API接口,我们只提供一个简单的get请求获取hello,kotlin输出信息:
  
  package com.edurt.ski.controller
  
  import org.springframework.web.bind.annotation.GetMapping
  
  import org.springframework.web.bind.annotation.RestController
  
  @RestController
  
  class HelloController {
  
  @GetMapping(value = "hello")
  
  fun hello(): String {
  
  return "hello,kotlin"
  
  }
  
  }
  
  修改SpringBootKotlinIntegration文件增加以下设置扫描路径
  
  @ComponentScan(value = [
  
  "com.edurt.ski",
  
  "com.edurt.ski.controller"
  
  ])
  
  添加页面功能
  
  修改pom.xml文件增加以下页面依赖
  
  <!-- mustache -->
  
  <dependency>
  
  <groupId>org.springframework.boot</groupId>
  
  <artifactId>spring-boot-starter-mustache</artifactId>
  
  </dependency>
  
  在src/main/resources路径下创建templates文件夹
  
  在templates文件夹下创建一个名为hello.mustache的页面文件
  
  <h1>Hello, Kotlin</h1>
  
  创建页面转换器HelloView
  
  package com.edurt.ski.view
  
  import org.springframework.stereotype.Controller
  
  import org.springframework.www.yongshiyule178.com ui.Model
  
  import org.springframework. www.zhenghongyule.cn web.bind.annotation.GetMapping
  
  @Controller
  
  class HelloView {
  
  @GetMapping(value = "hello_view")
  
  fun helloView(model: Model): String {
  
  return "hello"
  
  }
  
  }
  
  浏览器访问http://localhost:8080/hello_view即可看到页面内容
  
  添加数据持久化功能
  
  修改pom.xml文件增加以下依赖(由于测试功能我们使用h2内存数据库)
  
  <!-- data jpa and db -->
  
  <dependency>
  
  <groupId>org.springframework.boot</groupId>
  
  <artifactId>spring-boot-starter-data-jpa</artifactId>
  
  </dependency>
  
  <dependency>
  
  <groupId>com.h2database<www.xinghaiyule1.com /groupId>
  
  <artifactId>h2</artifactId>
  
  <scope>runtime</scope>
  
  </dependency>
  
  创建User实体
  
  package com.edurt.ski.model
  
  import javax.persistence.Entity
  
  import javax.persistence.GeneratedValue
  
  import javax.persistence.Id
  
  @Entity
  
  //class UserModel(
  
  // @Id
  
  // @GeneratedValue
  
  // private www.zhongyiyuL.cn var id: Long? = 0,
  
  // private var name: String
  
  //)
  
  class UserModel {
  
  @Id
  
  @GeneratedValue
  
  var id: Long? = 0
  
  get() = field
  
  set
  
  var name: String? = null
  
  get() = field
  
  set
  
  }
  
  创建UserSupport dao数据库操作工具类
  
  package com.edurt.ski.support
  
  import com.edurt.ski.www.jiahuayulpt.com model.UserModel
  
  import org.springframework.data.repository.PagingAndSortingRepository
  
  interface UserSupport : PagingAndSortingRepository<UserModel, Long> {
  
  }
  
  创建UserService服务类
  
  package com.edurt.ski.service
  
  import com.edurt.ski.model.UserModel
  
  interface UserService {
  
  /**
  
  * save model to db
  
  */
  
  fun save(model: UserModel): UserModel
  
  }
  
  创建UserServiceImpl实现类
  
  package com.edurt.www.feifanyule.cn/ ski.service
  
  import com.edurt.ski.model.UserModel
  
  import com.edurt.ski.support.UserSupport
  
  import org.springframework.www.tiaotiaoylzc.com stereotype.Service
  
  @Service(value = "userService")
  
  class UserServiceImpl(private val userSupport: UserSupport) : UserService {
  
  override fun save(model: UserModel): UserModel {
  
  return this.userSupport.www.mytxyl1.com save(model)
  
  }
  
  }
  
  创建用户UserController进行持久化数据
  
  package com.edurt.ski.controller
  
  import com.edurt.ski.model.UserModel
  
  import com.edurt.ski.service.UserService
  
  import org.springframework.web.bind.annotation.PathVariable
  
  import org.springframework.web.bind.annotation.PostMapping
  
  import org.springframework.web.bind.annotation.RequestMapping
  
  import org.springframework.web.bind.annotation.RestController
  
  @RestController
  
  @RequestMapping(value dasheng178.com= "user")
  
  class UserController(private val userService: UserService) {
  
  @PostMapping(value = "save/{name}")
  
  fun save(@PathVariable name: String): UserModel {
  
  val userModel = UserModel()
  
  // userModel.id = 1
  
  userModel.name = name
  
  return this.userService.save(userModel)
  
  }
  
  }
  
  使用控制台窗口执行以下命令保存数据
  
  curl -X POST http://localhost:8080/user/save/qianmoQ
  
  收到返回结果
  
  {"id":1,"name":"qianmoQ"}
  
  表示数据保存成功
  
  增加数据读取渲染功能
  
  修改UserService增加以下代码
  
  /**
  
  * get all model
  
  */
  
  fun getAll(page: Pageable): Page<UserModel>
  
  修改UserServiceImpl增加以下代码
  
  override fun getAll(page: Pageable): Page<UserModel> {
  
  return this.userSupport.findAll(page)
  
  }
  
  修改UserController增加以下代码
  
  @GetMapping(value = "list")
  
  fun get(): Page<UserModel> = this.userService.getAll(PageRequest(0, 10))
  
  创建UserView文件渲染User数据
  
  package com.edurt.ski.view
  
  import com.edurt.ski.service.UserService
  
  import org.springframework.www.yongshi123.cn data.domain.PageRequest
  
  import org.springframework.stereotype.Controller
  
  import org.springframework.ui.Model
  
  import org.springframework.ui.set
  
  import org.springframework.web.www.yigouyule2.cn bind.annotation.GetMapping
  
  @Controller
  
  class UserView(private val userService: UserService) {
  
  @GetMapping(value = "user_view")
  
  fun helloView(model: Model): String {
  
  model["users"] = this.userService.getAll(PageRequest(0, 10))
  
  return "user"
  
  }
  
  }
  
  创建user.mustache文件渲染数据(自行解析返回数据即可)
  
  {{users}}
  
  浏览器访问http://localhost:8080/user_view即可看到页面内容
  
  增加单元功能
  
  修改pom.xml文件增加以下依赖
  
  <!-- test -->
  
  <dependency>
  
  <groupId>org.springframework.boot</groupId>
  
  <artifactId>spring-boot-starter-test</artifactId>
  
  <scope>test</scope>
  
  <exclusions>
  
  <exclusion>
  
  <groupId>junit</groupId>
  
  <artifactId>junit</artifactId>
  
  </exclusion>
  
  <exclusion>
  
  <groupId>org.mockito</groupId>
  
  <artifactId>mockito-core</artifactId>
  
  </exclusion>
  
  </exclusions>
  
  </dependency>
  
  <dependency>
  
  <groupId>org.junit.jupiter</groupId>
  
  <artifactId>junit-jupiter-engine</artifactId>
  
  <scope>test</scope>
  
  </dependency>
  
  创建UserServiceTest文件进行测试UserService功能
  
  package com.edurt.ski
  
  import com.edurt.ski.service.UserService
  
  import org.junit.jupiter.api.AfterAll
  
  import org.junit.jupiter.api.Test
  
  import org.springframework.beans.factory.annotation.Autowired
  
  import org.springframework.boot.test.context.SpringBootTest
  
  import org.springframework.data.domain.PageRequest
  
  @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
  
  class UserServiceTest(@Autowired private val userService: UserService) {
  
  @Test
  
  fun `get all`() {
  
  println(">> Assert blog page title, content and status code")
  
  val entity = this.userService.getAll(PageRequest(0, 1))
  
  print(entity.totalPages)
  
  }
  
  }
  
  源码地址:GitHub

SpringBoot整合Kotlin构建Web服务的更多相关文章

  1. Spring-Boot:Spring Cloud构建微服务架构

    概述: 从上一篇博客<Spring-boot:5分钟整合Dubbo构建分布式服务> 过度到Spring Cloud,我们将开始学习如何使用Spring Cloud 来搭建微服务.继续采用上 ...

  2. SpringBoot整合阿里短信服务

    导读 由于最近手头上需要做个Message Gateway,涉及到:邮件(点我直达).短信.公众号(点我直达)等推送功能,网上学习下,整理下来以备以后使用. 步骤 点我直达 登录短信服务控制台 点我直 ...

  3. 极简SpringBoot指南-Chapter04-基于SpringBoot的书籍管理Web服务

    仓库地址 w4ngzhen/springboot-simple-guide: This is a project that guides SpringBoot users to get started ...

  4. Spring-boot:5分钟整合Dubbo构建分布式服务

    概述: Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合).从服务模型的角度来看,Dubbo采用的是一种非常 ...

  5. 第2-1-4章 SpringBoot整合FastDFS文件存储服务

    目录 5 SpringBoot整合 5.1 操作步骤 5.2 项目依赖 5.3 客户端开发 5.3.1 FastDFS配置 5.3.2 FastDFS配置类 5.3.3 文件工具类 5.3.4 文件上 ...

  6. dubbo学习实践(4)之Springboot整合Dubbo及Hystrix服务熔断降级

    1. springboot整合dubbo 在provider端,添加maven引入,修改pom.xml文件 引入springboot,版本:2.3.2.RELEASE,dubbo(org.apache ...

  7. 使用ServiceStack构建Web服务

    提到构建WebService服务,大家肯定第一个想到的是使用WCF,因为简单快捷嘛.首先要说明的是,本人对WCF不太了解,但是想快速建立一个WebService,于是看到了MSDN上的这一篇文章 Bu ...

  8. SpringBoot整合redis哨兵主从服务

    前提环境: 主从配置 http://www.cnblogs.com/zwcry/p/9046207.html 哨兵配置 https://www.cnblogs.com/zwcry/p/9134721. ...

  9. (转)使用ServiceStack构建Web服务

    提到构建WebService服务,大家肯定第一个想到的是使用WCF,因为简单快捷嘛.首先要说明的是,本人对WCF不太了解,但是想快速建立一个WebService,于是看到了MSDN上的这一篇文章 Bu ...

随机推荐

  1. 配置centos7来支持xshell远程访问和xftp传输文件

    前提: 首先需要一台已装有centos7的电脑(虚拟机的配置这里不说明,这里用的是物理机) 背景: 在工作中访问linux的环境通常需要Xshell等终端软件,通过配置静态IP远程服务器进行管理开发. ...

  2. 《杜增强讲Unity之Tanks坦克大战》6-发射子弹

    6 发射子弹 本节完成发射子弹的功能,最终代码如下:   image 首先,发射子弹得确定发射的位置和方向,还有发射的初始速度.具体的发射速度和按下发射按键的时间长短有关,这个关于子弹的蓄力我们在第九 ...

  3. linux-shell-screen后台调用-后台运行脚本和命令-仿start命令-伪窗口界面

    序 我比较熟练bat.cmd脚本.刚接触使用shell时,总会习惯想用windows窗口界面来套用shell脚本.于是找到screen后台命令,它可以交互shell脚本,保持后台运行.但是在批处理ba ...

  4. 【NLP】彻底搞懂BERT

    # 好久没更新博客了,有时候随手在本上写写,或者Evernote上记记,零零散散的笔记带来零零散散的记忆o(╥﹏╥)o..还是整理到博客上比较有整体性,也方便查阅~ 自google在2018年10月底 ...

  5. 占位符golang

    定义示例类型和变量 type Human struct { Name string } var people = Human{Name:"zhangsan"} 普通占位符 占位符 ...

  6. route命令详情

    基础命令学习目录首页 原文链接:https://www.cnblogs.com/lpfuture/p/5857738.html 考试题一:linux下如何添加路由(百度面试题) 以上是原题,老男孩老师 ...

  7. VSCode配合ESLint自动修复格式化

    开发Vue或者React的项目的时候,我们经常用到ESLint进行代码的校验,当代码出现不符合规范的格式的时候,ESLint会在控制台提示相关的异常信息. ESLint极大的提高了团队代码的一致性和规 ...

  8. php 数组去重

    php 数组去重 数组中重复项的去除 2010-07-28 15:29 一维数组的重复项: 使用array_unique函数即可,使用实例如下: <?php                    ...

  9. Invalid bound statement (not found): com.example.managerdemo.mapper.SingleTableMapper.selectAllValuesByConditionsNoPage

    报Invalid bound statement (not found): com.example.managerdemo.mapper.SingleTableMapper.selectAllValu ...

  10. 1001 A+B

    代码链接 PDF链接 首先要说的是这道题的难点是如何把数字输出加入逗号,毕竟数据范围并没有超过Long.当然这个难点也不是问题,将数字转为字符串,C中就有这样的函数,然后再用 %3==0 这样来控制输 ...