好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

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

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

<?xml version= "1.0" encoding= "utf-8" ?>

<project xmlns:xsi= "http://HdhCmsTestw3.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反射包

一个简单的应用类:

?

1

2

3

4

5

6

7

8

9

10

11

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输出信息:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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文件增加以下设置扫描路径

?

1

2

3

4

@componentscan (value = [

   "com.edurt.ski" ,

   "com.edurt.ski.controller"

])

添加页面功能

修改pom.xml文件增加以下页面依赖

?

1

2

3

4

5

<!-- mustache -->

<dependency>

   <groupid>org.springframework.boot</groupid>

   <artifactid>spring-boot-starter-mustache</artifactid>

</dependency>

在src/main/resources路径下创建templates文件夹

在templates文件夹下创建一个名为hello.mustache的页面文件

?

1

<h1>hello, kotlin</h1>

创建页面转换器helloview

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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内存数据库)

?

1

2

3

4

5

6

7

8

9

10

<!-- 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实体

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

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数据库操作工具类

?

1

2

3

4

5

6

7

8

package com.edurt.ski.support

 

import com.edurt.ski.model.usermodel

import org.springframework.data.repository.pagingandsortingrepository

 

interface usersupport : pagingandsortingrepository<usermodel, long > {

 

}

创建userservice服务类

?

1

2

3

4

5

6

7

8

9

10

11

12

package com.edurt.ski.service

 

import com.edurt.ski.model.usermodel

 

interface userservice {

 

   /**

    * save model to db

    */

   fun save(model: usermodel): usermodel

 

}

创建userserviceimpl实现类

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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进行持久化数据

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

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)

   }

 

}

使用控制台窗口执行以下命令保存数据

?

1

curl -x post http: //localhost:8080/user/save/qianmoq

收到返回结果

{"id":1,"name":"qianmoq"}

表示数据保存成功

增加数据读取渲染功能

修改userservice增加以下代码

?

1

2

3

4

/**

  * get all model

  */

fun getall(page: pageable): page<usermodel>

修改userserviceimpl增加以下代码

?

1

2

3

override fun getall(page: pageable): page<usermodel> {

   return this .usersupport.findall(page)

}

修改usercontroller增加以下代码

?

1

2

@getmapping (value = "list" )

fun get(): page<usermodel> = this .userservice.getall(pagerequest( 0 , 10 ))

创建userview文件渲染user数据

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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文件渲染数据(自行解析返回数据即可)

?

1

{{users}}

浏览器访问http://localhost:8080/user_view即可看到页面内容

增加单元功能

修改pom.xml文件增加以下依赖

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<!-- 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功能

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

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

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

原文链接:https://segmentfault测试数据/a/1190000018224145

查看更多关于SpringBoot整合Kotlin构建Web服务的方法示例的详细内容...

  阅读:11次