SpringBoot整合Kotlin構(gòu)建Web服務(wù)的方法示例
今天我們嘗試Spring Boot整合Kotlin,并決定建立一個非常簡單的Spring Boot微服務(wù),使用Kotlin作為編程語言進行編碼構(gòu)建。
創(chuàng)建一個簡單的Spring Boot應(yīng)用程序。我會在這里使用maven構(gòu)建項目:
<?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反射包
一個簡單的應(yīng)用類:
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接口功能
創(chuàng)建一個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文件增加以下設(shè)置掃描路徑
@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路徑下創(chuàng)建templates文件夾
在templates文件夾下創(chuàng)建一個名為hello.mustache的頁面文件
<h1>Hello, Kotlin</h1>
創(chuàng)建頁面轉(zhuǎn)換器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即可看到頁面內(nèi)容
添加數(shù)據(jù)持久化功能
修改pom.xml文件增加以下依賴(由于測試功能我們使用h2內(nèi)存數(shù)據(jù)庫)
<!-- 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>
創(chuàng)建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
}
創(chuàng)建UserSupport dao數(shù)據(jù)庫操作工具類
package com.edurt.ski.support
import com.edurt.ski.model.UserModel
import org.springframework.data.repository.PagingAndSortingRepository
interface UserSupport : PagingAndSortingRepository<UserModel, Long> {
}
創(chuàng)建UserService服務(wù)類
package com.edurt.ski.service
import com.edurt.ski.model.UserModel
interface UserService {
/**
* save model to db
*/
fun save(model: UserModel): UserModel
}
創(chuàng)建UserServiceImpl實現(xiàn)類
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)
}
}
創(chuàng)建用戶UserController進行持久化數(shù)據(jù)
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)
}
}
使用控制臺窗口執(zhí)行以下命令保存數(shù)據(jù)
curl -X POST http://localhost:8080/user/save/qianmoQ
收到返回結(jié)果
{"id":1,"name":"qianmoQ"}
表示數(shù)據(jù)保存成功
增加數(shù)據(jù)讀取渲染功能
修改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))
創(chuàng)建UserView文件渲染User數(shù)據(jù)
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"
}
}
創(chuàng)建user.mustache文件渲染數(shù)據(jù)(自行解析返回數(shù)據(jù)即可)
{{users}}
瀏覽器訪問http://localhost:8080/user_view即可看到頁面內(nèi)容
增加單元功能
修改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>
創(chuàng)建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
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
在Mybatis @Select注解中實現(xiàn)拼寫動態(tài)sql
這篇文章主要介紹了在Mybatis @Select注解中實現(xiàn)拼寫動態(tài)sql,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11
IntelliJ IDEA 2020 安裝和常用配置(推薦)
這篇文章主要介紹了IntelliJ IDEA 2020 安裝和常用配置(推薦),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-08-08
SpringBoot @ConfigurationProperties注解的簡單使用
即便現(xiàn)在簡化了配置,但是一個獨立的配置文件總是易于理解而且使人安心的。Spring在構(gòu)建完項目后,會默認在resources文件夾下創(chuàng)建一個application.properties文件,application.yml也是一樣的效果。@ConfigurationProperties可以獲取配置文件中的數(shù)據(jù),將其注入類。2021-05-05
Maven配置文件修改及導(dǎo)入第三方j(luò)ar包的實現(xiàn)
本文主要介紹了Maven配置文件修改及導(dǎo)入第三方j(luò)ar包的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-08-08

