SpringBoot整合Scala构建Web服务

栏目: Java · 发布时间: 5年前

内容简介:今天我们尝试Spring Boot整合Scala,并决定建立一个非常简单的Spring Boot微服务,使用Scala作为编程语言进行编码构建。收到返回结果表示数据保存成功

今天我们尝试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";
  }

}

添加数据持久化功能

  • 修改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

收到返回结果

表示数据保存成功

增加数据读取渲染功能

  • 修改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}}

增加单元功能

  • 修改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)
  }

}

源码地址: GitHub


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Measure What Matters

Measure What Matters

John Doerr / Portfolio / 2018-4-24 / GBP 19.67

In the fall of 1999, John Doerr met with the founders of a start-up he’d just given $11.8 million, the biggest investment of his career. Larry Page and Sergey Brin had amazing technology, entrepreneur......一起来看看 《Measure What Matters》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具