首页 > 编程 > Java > 正文

SpringBoot整合Kotlin构建Web服务的方法示例

2019-11-26 09:15:53
字体:
来源:转载
供稿:网友

今天我们尝试Spring Boot整合Kotlin,并决定建立一个非常简单的Spring Boot微服务,使用Kotlin作为编程语言进行编码构建。

创建一个简单的Spring Boot应用程序。我会在这里使用maven构建项目:

<?xml version="1.0" encoding="UTF-8"?><project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"     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.skiimport org.springframework.boot.autoconfigure.SpringBootApplicationimport org.springframework.boot.runApplication@SpringBootApplicationclass SpringBootKotlinIntegrationfun main(args: Array<String>) {  runApplication<SpringBootKotlinIntegration>(*args)}

添加Rest API接口功能

创建一个HelloController Rest API接口,我们只提供一个简单的get请求获取hello,kotlin输出信息:

package com.edurt.ski.controllerimport org.springframework.web.bind.annotation.GetMappingimport org.springframework.web.bind.annotation.RestController@RestControllerclass 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.viewimport org.springframework.stereotype.Controllerimport org.springframework.ui.Modelimport org.springframework.web.bind.annotation.GetMapping@Controllerclass 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</groupId>  <artifactId>h2</artifactId>  <scope>runtime</scope></dependency>

创建User实体

package com.edurt.ski.modelimport javax.persistence.Entityimport javax.persistence.GeneratedValueimport javax.persistence.Id@Entity//class UserModel(//    @Id//    @GeneratedValue//    private 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.supportimport com.edurt.ski.model.UserModelimport org.springframework.data.repository.PagingAndSortingRepositoryinterface UserSupport : PagingAndSortingRepository<UserModel, Long> {}

创建UserService服务类

package com.edurt.ski.serviceimport com.edurt.ski.model.UserModelinterface UserService {  /**   * save model to db   */  fun save(model: UserModel): UserModel}

创建UserServiceImpl实现类

package com.edurt.ski.serviceimport com.edurt.ski.model.UserModelimport com.edurt.ski.support.UserSupportimport org.springframework.stereotype.Service@Service(value = "userService")class UserServiceImpl(private val userSupport: UserSupport) : UserService {  override fun save(model: UserModel): UserModel {    return this.userSupport.save(model)  }}

创建用户UserController进行持久化数据

package com.edurt.ski.controllerimport com.edurt.ski.model.UserModelimport com.edurt.ski.service.UserServiceimport org.springframework.web.bind.annotation.PathVariableimport org.springframework.web.bind.annotation.PostMappingimport org.springframework.web.bind.annotation.RequestMappingimport org.springframework.web.bind.annotation.RestController@RestController@RequestMapping(value = "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.viewimport com.edurt.ski.service.UserServiceimport org.springframework.data.domain.PageRequestimport org.springframework.stereotype.Controllerimport org.springframework.ui.Modelimport org.springframework.ui.setimport org.springframework.web.bind.annotation.GetMapping@Controllerclass 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.skiimport com.edurt.ski.service.UserServiceimport org.junit.jupiter.api.AfterAllimport org.junit.jupiter.api.Testimport org.springframework.beans.factory.annotation.Autowiredimport org.springframework.boot.test.context.SpringBootTestimport 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

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表