如何使用新方式编写Spring MVC接口

 更新时间:2020年09月15日 10:25:11   作者:码农小胖哥  
这篇文章主要介绍了如何使用新方式编写Spring MVC接口,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

1. 前言

通常我们编写 Spring MVC 接口的范式是这样的:

@RestController
@RequestMapping("/v1/userinfo")
public class UserInfoController {

  @GetMapping("/foo")
  public String foo() {
    return "felord.cn";
  }
}

这种我都写吐了,今天换个口味,使用 Spring 5 新引入的函数式端点(Functional Endpoints)来耍耍。这种方式同样支持 Spring Webflux。

请注意可使用该特性的 Spring 版本不低于 Spring 5.2

2. 依赖

为了演示,这里极简化只引入 Spring MVC 的 starter :

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

3. RouterFunction

在函数式端点的写法中,传统的请求映射(@RequestMapping)被路由函数(RouterFunction)所代替。上面的写法等同于:

  @Bean
  public RouterFunction<ServerResponse> fooFunction() {
    return RouterFunctions.route()
        .GET("/v1/userinfo/foo", request -> ServerResponse.ok()
            .body("felord.cn"))
        .build();
  }

在该示例中,我使用了 RouterFunctions.route() 创建了一个RouterFunction,然后RouterFunction 提供了从请求到响应的细节操作。

4. ServerRequest/ServerResponse

ServerRequest 是对服务器端的 HTTP 请求的抽象,你可以通过该抽象获取请求的细节。对应的,ServerResponse 是对服务器端响应的抽象,你也可以通过该抽象构建响应的细节。这两个概念由下面的 HandlerFunction 接口进行 请求 → 响应 处理。

5. HandlerFunction

HandlerFunction 是一个函数式接口,它提供了从请求( ServerRequest)到响应(ServerResponse)的函数映射抽象。通常你的业务逻辑由该接口进行实现。从 ServerRequest 中获取请求的细节,然后根据业务构建一个 ServerResponse 响应。

HandlerFunction<ServerResponse> handlerFunction = request -> ServerResponse.ok().body("felord.cn");

6. RequestPredicate

RequestPredicate 可以让你根据请求的一些细节,比如 请求方法、请求头、请求参数等等进行断言以决定是否路由。

这里举一个例子,假如我们希望请求接口/v1/userinfo/predicate时根据不同的参数处理不同的业务,当携带参数 plan时才能进行处理。我们可以这么写:

  @Bean
  public RouterFunction<ServerResponse> predicateFunction() {
    return RouterFunctions.route()
        .GET("/v1/userinfo/predicate",
            request -> request.param("plan").isPresent(),
            request -> ServerResponse.ok().body("felord.cn"))
        .build();
  }

然后我们测试一下:

当携带参数 plan时:

GET http://localhost:8080/v1/userinfo/predicate?plan=

HTTP/1.1 200
Content-Type: text/plain;charset=UTF-8
Content-Length: 9
Date: Thu, 14 May 2020 07:57:35 GMT
Keep-Alive: timeout=60
Connection: keep-alive

felord.cn

不携带参数plan时:

GET http://localhost:8080/v1/userinfo/predicate

HTTP/1.1 404
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json
Transfer-Encoding: chunked
Date: Thu, 14 May 2020 08:00:15 GMT
Keep-Alive: timeout=60
Connection: keep-alive

{
 "timestamp": "2020-05-14T08:00:15.659+0000",
 "status": 404,
 "error": "Not Found",
 "message": "No message available",
 "path": "/v1/userinfo/predicate"
}

7. 小结

函数式端点是 Spring 5 提供的一个新的接口范式风格,对于 Spring MVC 来说 Spring 5.2 才进行了支持。也是顺应函数式编程的一个未来趋势。

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

相关文章

  • Spring Security中的Servlet过滤器体系代码分析

    Spring Security中的Servlet过滤器体系代码分析

    这篇文章主要介绍了Spring Security中的Servlet过滤器体系,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • eclipse的web项目实现Javaweb购物车的方法

    eclipse的web项目实现Javaweb购物车的方法

    这篇文章主要介绍了eclipse的web项目实现Javaweb购物车的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Java基本数据类型存储在JVM中的存储位置介绍

    Java基本数据类型存储在JVM中的存储位置介绍

    这篇文章主要介绍了Java基本数据类型存储在JVM中的存储位置,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • SpringBoot如何配置文件给bean赋值问题

    SpringBoot如何配置文件给bean赋值问题

    这篇文章主要介绍了SpringBoot如何配置文件给bean赋值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • 基于selenium 获取新页面元素失败的解决方法

    基于selenium 获取新页面元素失败的解决方法

    今天小编就为大家分享一篇基于selenium 获取新页面元素失败的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • Java如何把map分割成多个map

    Java如何把map分割成多个map

    这篇文章主要介绍了Java如何把map分割成多个map,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-08-08
  • Java8接口之默认方法与静态方法详解

    Java8接口之默认方法与静态方法详解

    java8中为接口新增了一项功能,定义一个或者更多个静态方法,类似于类中的静态方法,接口定义的静态方法可以独立于任何对象调用,下面这篇文章主要给大家介绍了关于Java8接口之默认方法与静态方法的相关资料,需要的朋友可以参考下
    2022-03-03
  • java中File类的三种创建文件夹方法总结

    java中File类的三种创建文件夹方法总结

    这篇文章主要给大家介绍了关于java中File类的三种创建文件夹方法,File类代表文件或目录路径名的抽象表达形式,通过File类提供的方法,我们可以很方便地创建文件夹,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-04-04
  • 浅谈Java并发 J.U.C之AQS:CLH同步队列

    浅谈Java并发 J.U.C之AQS:CLH同步队列

    AQS内部维护着一个FIFO队列,该队列就是CLH同步队列。下面小编来简单介绍下这个队列
    2019-05-05
  • 基于SpringCloudGateway实现微服务网关的方式

    基于SpringCloudGateway实现微服务网关的方式

    Spring Cloud Gateway是Spring 官方基于Spring 5.0,Spring Boot 2.0和Project Reactor 等技术开发的网关,旨在为微服务架构提供一种简单而有效的统一的API路由管理方式,对SpringCloudGateway实现微服务网关相关知识感兴趣的朋友一起看看吧
    2021-12-12

最新评论