今天我们尝试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

最新文章

  1. [LeetCode] H-Index 求H指数
  2. jpeg相关知识
  3. 携程Ctrip DAL的学习 2
  4. 【Android端APP 安装包检查】安装包检查具体内容及实现方法
  5. 【C语言入门教程】2.3 整型数据
  6. 后缀数组 POJ 3261 Milk Patterns
  7. ASP.NET Web API 特性
  8. elasticsearch1.0 升级2.2的数据备份和恢复
  9. 最最实用的30个Linux命令!
  10. URAL 1167. Bicolored Horses (DP)
  11. OpenCV之邻域运算之最值滤波
  12. Reduce对Pig作业性能的影响
  13. EasyARM i.mx28学习笔记——开箱试用总结
  14. hdu 1348 Wall(凸包模板题)
  15. C#之—委托
  16. UML的基本关联
  17. 玩转Web之Json(二)----jquery easy ui + Ajax +Json+SQL实现前后台数据交互
  18. linux中如何查看某一进程的启动时间
  19. JPA实体类注解、springboot测试类、lombok的使用
  20. leetcode8:字符串转整数 (atoi)

热门文章

  1. php 文件上传缩略图路径分析类
  2. Python里的类和对象简介
  3. halcon算子之tuple_gen_const,用于生成特定长度的元组并且初始化其元素
  4. 基于Redis实现分布式锁(续)
  5. 来源自rnnoise,但非rnn
  6. CDN的基本原理和基础架构
  7. 高可用OpenStack(Queen版)集群-6.Nova控制节点集群
  8. 从零开始的Python学习Episode 21——socket基础
  9. python-模拟掷骰子,两个筛子数据可视化
  10. 解决 vuex mapGetters 语法报错 (Unexpected token )