今天我们尝试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.ssiimport org.springframework.boot.SpringApplication
import org.springframework.boot.autoconfigure.SpringBootApplication@SpringBootApplication
class SpringBootScalaIntegrationobject SpringBootScalaIntegration extends App{SpringApplication.run(classOf[SpringBootScalaIntegration])}
复制代码

添加Rest API接口功能


  • 创建一个HelloController Rest API接口,我们只提供一个简单的get请求获取hello,scala输出信息
package com.edurt.ssi.controllerimport 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.viewimport 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.modelimport javax.persistence.{Entity, GeneratedValue, Id}@Entity
class UserModel {@Id@GeneratedValuevar id: Long = 0var name: String = null}
复制代码
  • 创建UserSupport dao数据库操作工具类
package com.edurt.ssi.supportimport com.edurt.ssi.model.UserModel
import org.springframework.data.repository.PagingAndSortingRepositorytrait UserSupport extends PagingAndSortingRepository[UserModel, Long] {}
复制代码
  • 创建UserService服务类
package com.edurt.ssi.serviceimport com.edurt.ssi.model.UserModeltrait UserService {/*** save model to db*/def save(model: UserModel): UserModel;}
复制代码
  • 创建UserServiceImpl实现类
package com.edurt.ssi.serviceimport 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.controllerimport 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 = namereturn 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.viewimport 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.ssiimport 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) {@Testdef `get all`() {println(">> Assert blog page title, content and status code")val entity = this.userService.getAll(PageRequest.of(0, 1))print(entity.getTotalPages)}}
复制代码

源码地址:GitHub

SpringBoot整合Scala构建Web服务相关推荐

  1. 5分钟实现SpringBoot整合Dubbo构建分布式服务

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:jaycekon cnblogs.com/jaycekon/ ...

  2. Springboot 基于CXF构建WebService服务

    前言 最近因为系统需要接入了一个新的支付通道,一般来说都是使用RestApi 来接入,但是本次接入的支付通道为境外支付,使用的WebService,对于WS我们在实际业务中基本上不会用到,所以查阅了一 ...

  3. WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发

    继WSE3.0构建Web服务安全(1):WSE3.0安全机制与实例开发和WSE3.0构建Web服务安全(2):非对称加密.公钥.密钥.证书.签名的区别和联系以及X.509 证书的获得和管理之后,今天我 ...

  4. WSE3.0构建Web服务安全(4):MTOM消息传输优化和文件上传、下载

    MTOM消息优化传输机制主要应用于大量数据的传输,很多文章中也直接得出结论:使用MTOM文件传输效率高.为什么MTOM的数据传输效率会比别的方式要高?MTOM真的如此完美吗,它有什么不足?什么情况下使 ...

  5. 关于SpringBoot整合Netty客户端和服务端实现JT808协议

    关于SpringBoot整合Netty客户端和服务端实现JT808协议 最近做了一个使用netty实现交通部JT808协议的项目,对比了mina和netty两种框架的使用,先整理一下netty的实现过 ...

  6. php构建soap_使用PHP构建Web服务

    php构建soap 在你开始前 关于本教程 本教程适用于希望通过在PHP中创建Web服务来跳入Web服务潮流PHP程序员. 您将通过使用PHP构建SOAP服务器来构建Web服务. 您将创建的Web服务 ...

  7. DA LAO:SpringBoot讲述 快速构建微服务体系。

    在当今互联网时代,技术圈最火的名词大概就是微服务了.国内外的互联网技术会议上,但凡分享题目中包含"MicroService",不论内容质量如何,一定人山人海.摩肩接踵. 而今天分享 ...

  8. spring整合dubbo和springboot整合dubbo,实现服务暴露区别

    spring整合dubbo的时候实现服务暴露是这么做的,在xml里配置 那么springboot整合dubbo的时候,是通过dubbo的@Service 注解实现的 之前我们是通过@Autowired ...

  9. 利用 Celery 构建 Web 服务的后台任务调度模块

    来源:http://www.tuicool.com/articles/Enaeymm 任务队列在 Web 服务里的应用 在 Web2.0 后的时代,社交网站.搜索引擎的的迅猛发展对 Web 服务的后台 ...

  10. 使用 Ajax 调用 SOAP Web 服务,第 1 部分: 构建 Web 服务客户机

    James Snell (jasnell@us.ibm.com), 软件工程师,新兴技术, IBM James Snell 是 IBM 的 software group 中的 emerging Int ...

最新文章

  1. Asp.Net Web API 2第一课——入门
  2. 鏖战双十一-阿里直播平台面临的技术挑战
  3. 【NLP】GloVe的Python实现
  4. Spring Security——认证失败时获取认证信息(用户名、密码、IP、SESSIONID)
  5. iOS学习笔记11-多线程入门
  6. No plugin found for prefix ‘scala‘ pom.xml
  7. Ubuntu 16.04下Linux驱动编写第一步
  8. windows平台下CMDER的安装和配置
  9. 数据库:园林软件(综合类题库)
  10. 大创和互联网加_大创?科研立项?互联网+大赛?创业大赛?……你还在纠结吗?...
  11. python代码直接关机_关机信号在python脚本中运行代码
  12. 动态监控zookeeper服务节点变动(附zkUI使用)
  13. 【财务架构day1】财务系统的领域建模——五视图法的分析
  14. CC2530芯片资料
  15. Linux下干净卸载mysql详解
  16. [NOIP2017模拟]permut
  17. 把生活过成 你想要的样子
  18. 桌面图标注册表对应项
  19. orgchart实现组织结构图
  20. linux应用程序开发题库,Linux应用程序开发练习题ppt课件

热门文章

  1. unity设置一个物体是另一个物体的子物体
  2. Atitit 常见编程语言读写数据库的api目录1.1. Php pdo 11.2. Java jdbctmpltr 11.3. Nodejs mysql模块 11.4. Pytho
  3. Atitit 架构的艺术 目录 1. 按照技术站分类 1 1.1. LAMP架构,到IOE架构,再到分布式架构 1 1.2. Ssh ssm 1 2. Bs cs web hybrid架构 1 3.
  4. Atitit WatchService 使用和不能监控抓取到的解决 原因是生成速度太快,但处理速度慢,导致许多event 忽视了.. How to solu??? asyn to process
  5. Atitit js通讯技术 jsbridge ajax bomext Atitit jsbridge 与jsrpc 的联系与区别 JSBridge——Web与Native交互 侧重本
  6. atitit.研发管理--标准化流程总结---java开发环境与项目部署环境的搭建工具包总结
  7. atitit.信息安全的控制总结o7
  8. paip.语义分析--分词--常见的单音节字词 2_deDuli 单字词 774个
  9. paip.提升安全性----.net C#源码防止反编译以及源码加密
  10. Julia : 在编程中的Unicode 字符