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.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服务相关推荐
- 5分钟实现SpringBoot整合Dubbo构建分布式服务
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:jaycekon cnblogs.com/jaycekon/ ...
- Springboot 基于CXF构建WebService服务
前言 最近因为系统需要接入了一个新的支付通道,一般来说都是使用RestApi 来接入,但是本次接入的支付通道为境外支付,使用的WebService,对于WS我们在实际业务中基本上不会用到,所以查阅了一 ...
- WSE3.0构建Web服务安全(3):WSE3.0策略配置、证书、签名、与实例开发
继WSE3.0构建Web服务安全(1):WSE3.0安全机制与实例开发和WSE3.0构建Web服务安全(2):非对称加密.公钥.密钥.证书.签名的区别和联系以及X.509 证书的获得和管理之后,今天我 ...
- WSE3.0构建Web服务安全(4):MTOM消息传输优化和文件上传、下载
MTOM消息优化传输机制主要应用于大量数据的传输,很多文章中也直接得出结论:使用MTOM文件传输效率高.为什么MTOM的数据传输效率会比别的方式要高?MTOM真的如此完美吗,它有什么不足?什么情况下使 ...
- 关于SpringBoot整合Netty客户端和服务端实现JT808协议
关于SpringBoot整合Netty客户端和服务端实现JT808协议 最近做了一个使用netty实现交通部JT808协议的项目,对比了mina和netty两种框架的使用,先整理一下netty的实现过 ...
- php构建soap_使用PHP构建Web服务
php构建soap 在你开始前 关于本教程 本教程适用于希望通过在PHP中创建Web服务来跳入Web服务潮流PHP程序员. 您将通过使用PHP构建SOAP服务器来构建Web服务. 您将创建的Web服务 ...
- DA LAO:SpringBoot讲述 快速构建微服务体系。
在当今互联网时代,技术圈最火的名词大概就是微服务了.国内外的互联网技术会议上,但凡分享题目中包含"MicroService",不论内容质量如何,一定人山人海.摩肩接踵. 而今天分享 ...
- spring整合dubbo和springboot整合dubbo,实现服务暴露区别
spring整合dubbo的时候实现服务暴露是这么做的,在xml里配置 那么springboot整合dubbo的时候,是通过dubbo的@Service 注解实现的 之前我们是通过@Autowired ...
- 利用 Celery 构建 Web 服务的后台任务调度模块
来源:http://www.tuicool.com/articles/Enaeymm 任务队列在 Web 服务里的应用 在 Web2.0 后的时代,社交网站.搜索引擎的的迅猛发展对 Web 服务的后台 ...
- 使用 Ajax 调用 SOAP Web 服务,第 1 部分: 构建 Web 服务客户机
James Snell (jasnell@us.ibm.com), 软件工程师,新兴技术, IBM James Snell 是 IBM 的 software group 中的 emerging Int ...
最新文章
- Asp.Net Web API 2第一课——入门
- 鏖战双十一-阿里直播平台面临的技术挑战
- 【NLP】GloVe的Python实现
- Spring Security——认证失败时获取认证信息(用户名、密码、IP、SESSIONID)
- iOS学习笔记11-多线程入门
- No plugin found for prefix ‘scala‘ pom.xml
- Ubuntu 16.04下Linux驱动编写第一步
- windows平台下CMDER的安装和配置
- 数据库:园林软件(综合类题库)
- 大创和互联网加_大创?科研立项?互联网+大赛?创业大赛?……你还在纠结吗?...
- python代码直接关机_关机信号在python脚本中运行代码
- 动态监控zookeeper服务节点变动(附zkUI使用)
- 【财务架构day1】财务系统的领域建模——五视图法的分析
- CC2530芯片资料
- Linux下干净卸载mysql详解
- [NOIP2017模拟]permut
- 把生活过成 你想要的样子
- 桌面图标注册表对应项
- orgchart实现组织结构图
- linux应用程序开发题库,Linux应用程序开发练习题ppt课件
热门文章
- unity设置一个物体是另一个物体的子物体
- Atitit 常见编程语言读写数据库的api目录1.1. Php pdo 11.2. Java jdbctmpltr 11.3. Nodejs mysql模块 11.4. Pytho
- Atitit 架构的艺术 目录 1. 按照技术站分类	1 1.1. LAMP架构,到IOE架构,再到分布式架构	1 1.2. Ssh ssm	1 2. Bs cs web hybrid架构	1 3.
- Atitit WatchService 使用和不能监控抓取到的解决 原因是生成速度太快,但处理速度慢,导致许多event 忽视了.. How to solu??? asyn to process
- Atitit js通讯技术 jsbridge ajax bomext Atitit jsbridge 与jsrpc 的联系与区别 JSBridge——Web与Native交互 侧重本
- atitit.研发管理--标准化流程总结---java开发环境与项目部署环境的搭建工具包总结
- atitit.信息安全的控制总结o7
- paip.语义分析--分词--常见的单音节字词 2_deDuli 单字词 774个
- paip.提升安全性----.net C#源码防止反编译以及源码加密
- Julia : 在编程中的Unicode 字符