阅读 68

SpringBoot整合Scala构建Web服务

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

创建项目


  • 初始化项目

mvn archetype:generate -DgroupId=com.edurt.ssi -DartifactId=springboot-scala-integration -DarchetypeArtifactId=maven-archetype-quickstart -Dversion=1.0.0 -DinteractiveMode=false 复制代码

  • 修改pom.xml增加java和scala的支持

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">     <modelVersion>4.0.0</modelVersion>     <groupId>com.edurt.ssi</groupId>     <artifactId>springboot-scala-integration</artifactId>     <packaging>jar</packaging>     <version>1.0.0</version>     <name>springboot-scala-integration</name>     <description>SpringBoot Scala Integration is a open source springboot, scala 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>         <maven.compiler.source>1.8</maven.compiler.source>         <maven.compiler.target>1.8</maven.compiler.target>         <!-- dependency config -->         <dependency.scala.version>2.12.1</dependency.scala.version>         <!-- plugin config -->         <plugin.maven.scala.version>3.1.3</plugin.maven.scala.version>     </properties>     <dependencies>         <dependency>             <groupId>org.scala-lang</groupId>             <artifactId>scala-library</artifactId>             <version>${dependency.scala.version}</version>         </dependency>         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-web</artifactId>         </dependency>     </dependencies>     <build>         <sourceDirectory>${project.basedir}/src/main/scala</sourceDirectory>         <testSourceDirectory>${project.basedir}/src/test/scala</testSourceDirectory>         <plugins>             <plugin>                 <groupId>net.alchim31.maven</groupId>                 <artifactId>scala-maven-plugin</artifactId>                 <version>${plugin.maven.scala.version}</version>                 <executions>                     <execution>                         <goals>                             <goal>compile</goal>                             <goal>testCompile</goal>                         </goals>                     </execution>                 </executions>             </plugin>             <plugin>                 <groupId>org.springframework.boot</groupId>                 <artifactId>spring-boot-maven-plugin</artifactId>             </plugin>         </plugins>     </build> </project> 复制代码

  • 一个简单的应用类

package com.edurt.ssi import org.springframework.boot.SpringApplication import org.springframework.boot.autoconfigure.SpringBootApplication @SpringBootApplication class SpringBootScalaIntegration object SpringBootScalaIntegration extends App{   SpringApplication.run(classOf[SpringBootScalaIntegration]) } 复制代码

添加Rest API接口功能


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

package com.edurt.ssi.controller import org.springframework.web.bind.annotation.{GetMapping, RestController} @RestController class HelloController {   @GetMapping(value = Array("hello"))   def hello(): String = {     return "hello,scala"   } } 复制代码

  • 修改SpringBootScalaIntegration文件增加以下设置扫描路径

@ComponentScan(value = Array(   "com.edurt.ssi.controller" )) 复制代码

添加页面功能


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

<!-- mustache --> <dependency>     <groupId>org.springframework.boot</groupId>     <artifactId>spring-boot-starter-mustache</artifactId> </dependency> 复制代码

  • 修改SpringBootScalaIntegration文件增加以下设置扫描路径ComponentScan的value字段中

"com.edurt.ssi.view" 复制代码

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

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

<h1>Hello, Scala</h1> 复制代码

  • 创建页面转换器HelloView

package com.edurt.ssi.view import org.springframework.stereotype.Controller import org.springframework.web.bind.annotation.GetMapping @Controller class HelloView {   @GetMapping(value = Array("hello_view"))   def helloView: 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> 复制代码

  • 修改SpringBootScalaIntegration文件增加以下设置扫描model路径

@EntityScan(value = Array(   "com.edurt.ssi.model" )) 复制代码

  • 创建User实体

package com.edurt.ssi.model import javax.persistence.{Entity, GeneratedValue, Id} @Entity class UserModel {   @Id   @GeneratedValue   var id: Long = 0   var name: String = null } 复制代码

  • 创建UserSupport dao数据库操作工具类

package com.edurt.ssi.support import com.edurt.ssi.model.UserModel import org.springframework.data.repository.PagingAndSortingRepository trait UserSupport extends PagingAndSortingRepository[UserModel, Long] { } 复制代码

  • 创建UserService服务类

package com.edurt.ssi.service import com.edurt.ssi.model.UserModel trait UserService {   /**     * save model to db     */   def save(model: UserModel): UserModel; } 复制代码

  • 创建UserServiceImpl实现类

package com.edurt.ssi.service import com.edurt.ssi.model.UserModel import com.edurt.ssi.support.UserSupport import org.springframework.beans.factory.annotation.Autowired import org.springframework.stereotype.Service @Service(value = "userService") class UserServiceImpl @Autowired() (                                    val userSupport: UserSupport                                  ) extends UserService {   /**     * save model to db     */   override def save(model: UserModel): UserModel = {     return this.userSupport.save(model)   } } 复制代码

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

package com.edurt.ssi.controller import com.edurt.ssi.model.UserModel import com.edurt.ssi.service.UserService import org.springframework.beans.factory.annotation.Autowired import org.springframework.web.bind.annotation.{PathVariable, PostMapping, RequestMapping, RestController} @RestController @RequestMapping(value = Array("user")) class UserController @Autowired()(                                    val userService: UserService                                  ) {   @PostMapping(value = Array("save/{name}"))   def save(@PathVariable name: String): Long = {     val userModel = {       new UserModel()     }     userModel.name = name     return this.userService.save(userModel).id   } } 复制代码

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

curl -X POST http://localhost:8080/user/save/qianmoQ 复制代码

收到返回结果

1 复制代码

表示数据保存成功

增加数据读取渲染功能


  • 修改UserService增加以下代码

/**  * get all model  */ def getAll(page: Pageable): Page[UserModel] 复制代码

  • 修改UserServiceImpl增加以下代码

/**   * get all model   */ override def getAll(page: Pageable): Page[UserModel] = {   return this.userSupport.findAll(page) } 复制代码

  • 修改UserController增加以下代码

@GetMapping(value = Array("list")) def get(): Page[UserModel] = this.userService.getAll(PageRequest.of(0, 10)) 复制代码

  • 创建UserView文件渲染User数据

package com.edurt.ssi.view import com.edurt.ssi.service.UserService import org.springframework.beans.factory.annotation.Autowired import org.springframework.data.domain.PageRequest import org.springframework.stereotype.Controller import org.springframework.ui.Model import org.springframework.web.bind.annotation.GetMapping @Controller class UserView @Autowired()(                              private val userService: UserService                            ) {   @GetMapping(value = Array("user_view"))   def helloView(model: Model): String = {     model.addAttribute("users", this.userService.getAll(PageRequest.of(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.ssi import com.edurt.ssi.service.UserService 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   def `get all`() {     println(">> Assert blog page title, content and status code")     val entity = this.userService.getAll(PageRequest.of(0, 1))     print(entity.getTotalPages)   } }


作者:EdurtIO
链接:https://juejin.cn/post/7171246742833201165


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐