评论

收藏

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

编程语言 编程语言 发布于:2021-09-18 17:59 | 阅读数:399 | 评论:0

这篇文章主要介绍了SpringBoot整合Kotlin构建Web服务的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
今天我们尝试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.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.ui.model
import org.springframework.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</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 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.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.ski.service
 
import com.edurt.ski.model.usermodel
import com.edurt.ski.support.usersupport
import 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.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 = "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.data.domain.pagerequest
import org.springframework.stereotype.controller
import org.springframework.ui.model
import org.springframework.ui.set
import org.springframework.web.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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持CodeAE代码之家
原文链接:https://segmentfault.com/a/1190000018224145

关注下面的标签,发现更多相似文章