如何使用新方式编写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 才进行了支持。也是顺应函数式编程的一个未来趋势。

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

(0)

相关推荐

  • springMVC利用FastJson接口返回json数据相关配置详解

    一直使用的是FastJson,感觉还不错,很方便.看了一段别人的分析,觉得很有道理. 为什么要使用Fastjson,其实原因不需要太多,喜欢就行. 我之所以要替换掉Jackson最主要的原因是Jackson在处理对象之前的循环嵌套关系时不便. ps:什么是对象间的循环嵌套?比如A有一个List,B对象里又有一个A对象,当然返回A对象的Json字符串时,如果是 Jackson就会发生异常,因为Jackson天生不具备处理这种关系的能力,而Fastjson正好具备了这种能力(另,如果你用的是 Jac

  • Spring Boot配置接口WebMvcConfigurer的实现

    WebMvcConfigurer配置类其实是Spring内部的一种配置方式,采用JavaBean的形式来代替传统的xml配置文件形式进行针对框架个性化定制.基于java-based方式的spring mvc配置,需要创建一个配置类并实现WebMvcConfigurer 接口,WebMvcConfigurerAdapter 抽象类是对WebMvcConfigurer接口的简单抽象(增加了一些默认实现),但在在SpringBoot2.0及Spring5.0中WebMvcConfigurerAdapt

  • Spring MVC的优点与核心接口_动力节点Java学院整理

    为开发团队选择一款优秀的MVC框架是件难事儿,在众多可行的方案中决择需要很高的经验和水平.你的一个决定会影响团队未来的几年.要考虑方面太多: 1.简单易用,以提高开发效率.使小部分的精力在框架上,大部分的精力放在业务上. 2.性能优秀,这是一个最能吸引眼球的话题. 3.尽量使用大众的框架(避免使用小众的.私有的框架),新招聘来的开发人员有一些这方面技术积累,减低人员流动再适应的影响. 如果你还在为这件事件发愁,本文最适合你了.选择Spring MVC吧. Spring MVC是当前最优秀的MVC

  • SpringMVC编程使用Controller接口实现控制器实例代码

    Controller简介 Controller控制器,是MVC中的部分C,为什么是部分呢?因为此处的控制器主要负责功能处理部分: 1.收集.验证请求参数并绑定到命令对象: 2.将命令对象交给业务对象,由业务对象处理并返回模型数据: 3.返回ModelAndView(Model部分是业务对象返回的模型数据,视图部分为逻辑视图名). DispatcherServlet,主要负责整体的控制流程的调度部分: 1.负责将请求委托给控制器进行处理: 2.根据控制器返回的逻辑视图名选择具体的视图进行渲染(并把

  • Springmvc Controller接口代码示例

    Spring MVC Controller控制器,是MVC中的部分C,为什么是部分呢?因为此处的控制器主要负责功能处理部分: 收集.验证请求参数并绑定到命令对象: 将命令对象交给业务对象,由业务对象处理并返回模型数据: 返回ModelAndView(Model部分是业务对象返回的模型数据,视图部分为逻辑视图名). 1. 继承该接口 Controller接口,重写对应方法,或者采用注解Controller,自定义映射文件 @Controller @RequestMapping("/flight&q

  • Spring MVC 使用支付宝接口完成在线支付的示例代码

    项目中要使用到在线支付功能 目前常用的在线支付手段主要是 支付宝 和微信. 这里我使用的是支付宝支付,支付宝有个好处就是他有一个沙箱模式 即使没有申请渠道的资格也可以体验一把在线支付. 第一步:完善沙箱信息 进入支付宝的开发者中心 就可以看到有个沙箱环境 使用支付宝提供的秘钥生成工具 生成对应的秘钥 一定要保存好.支付宝推荐使用RSA2(SHA256)秘钥 把自己的公钥填上去就可以了. 第二步 阅读在线支付开发文档 里面需要的配置信息 对应的使用沙箱环境的信息 第三步 环境搭建 下载服务端SDK

  • Spring MVC接口防数据篡改和重复提交

    本文实例为大家分享了Spring MVC接口防数据篡改和重复提交的具体代码,供大家参考,具体内容如下 一.自定义一个注解,此注解可以使用在方法上或类上 使用在方法上,表示此方法需要数据校验 使用在类上,表示此类下的所有方法需要数据校验 此注解对无参数方法不起作用 import org.springframework.stereotype.Component; @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionP

  • SpringMVC Restful api接口实现的代码

    [前言] 面向资源的 Restful 风格的 api 接口本着简洁,资源,便于扩展,便于理解等等各项优势,在如今的系统服务中越来越受欢迎. .net平台有WebAPi项目是专门用来实现Restful api的,其良好的系统封装,简洁优雅的代码实现,深受.net平台开发人员所青睐,在后台服务api接口中,已经逐步取代了辉煌一时MVC Controller,更准确地说,合适的项目使用更加合适的工具,开发效率将会更加高效. python平台有tornado框架,也是原生支持了Restful api,在

  • spring MVC中接口参数解析的过程详解

    前言 前天工作中遇到了这样一个问题,我在接口的参数封装了一个pojo,这是很常见的,当参数一多,惯性的思维就是封装一个pojo.那么在参数前有很多注解可以添加,比如:@requestParam,@requestBody,@pathvariable等.我的理解是这样的,首先我先申明,我并是没有看过源码,只是凭经验理解.@requestParam试用于get请求,参数在http的header中的URL上,具体放在?后面以key=value的形式存在.@requestBody适用于post请求中参数在

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

    1. 前言 通常我们编写 Spring MVC 接口的范式是这样的: @RestController @RequestMapping("/v1/userinfo") public class UserInfoController { @GetMapping("/foo") public String foo() { return "felord.cn"; } } 这种我都写吐了,今天换个口味,使用 Spring 5 新引入的函数式端点(Funct

  • 编写Spring MVC控制器的14个技巧(小结)

    通常,在Spring MVC中,我们编写一个控制器类来处理来自客户端的请求.然后,控制器调用业务类来处理与业务相关的任务,然后将客户端重定向到逻辑视图名称,该名称由Spring的调度程序Servlet解析,以呈现结果或输出.这样就完成了典型的请求-响应周期的往返.今天整理了一下编写Spring MVC控制器的14个技巧,你今天get到了吗? \(≧▽≦)/ 1.使用@Controller构造型 这是创建可以处理一个或多个请求的控制器类的最简单方法.仅通过用构造型注释一个类@Controller 

  • 14个编写Spring MVC控制器的实用小技巧(吐血整理)

    本文介绍了编写Spring MVC框架的控制器(controller)的基础技巧和最佳操作.在Spring MVC框架中,编写控制器类通常是为了处理用户提出的请求. 编写完成后,控制器会调用一个业务类来处理业务相关任务,进而重定向客户到逻辑视图名.Springdispatcher servlet会对逻辑视图名进行解析,并渲染结果或输出.这就是一个典型的"请求-响应"的完整流程. 1.使用@controllerstereotype 创建一个能够处理单个或多个请求的控制器类,最简单的方法就

  • 基于Mock测试Spring MVC接口过程解析

    1. 前言 在Java开发中接触的开发者大多数不太注重对接口的测试,结果在联调对接中出现各种问题.也有的使用Postman等工具进行测试,虽然在使用上没有什么问题,如果接口增加了权限测试起来就比较恶心了.所以建议在单元测试中测试接口,保证在交付前先自测接口的健壮性.今天就来分享一下胖哥在开发中是如何对Spring MVC接口进行测试的. 在开始前请务必确认添加了Spring Boot Test相关的组件,在最新的版本中应该包含以下依赖: <dependency> <groupId>

  • spring mvc中的@PathVariable动态参数详解

    目录 spring mvc @PathVariable动态参数 spring mvc是如何做到根据参数名动态绑定参数的? 反射获取参数名 -parameters参数 -g参数 ASM SpringMVC的处理方式 总结 spring mvc @PathVariable动态参数 spring mvc中的@PathVariable是用来获得请求url中的动态参数的,十分方便 @Controller public class TestController { @RequestMapping(value

  • 详解Spring MVC的拦截器与异常处理机制

    目录 1.SpringMVC拦截器 1.1拦截器(interceptor)的作用 1.2拦截器和过滤器的区别 1.3拦截器的快速入门 1.4多拦截器操作 1.5拦截器方法说明 2.SpringMVC异常处理 2.1异常处理的思路 2.2异常处理的两种方式 2.3简单的异常处理器SimpleMappingExceptinResolver 2.4自定义异常处理步骤 总结 1. SpringMVC拦截器 1.1 拦截器(interceptor)的作用 Spring MVC 的拦截器类似于 Servle

  • Java 超详细讲解Spring MVC异常处理机制

    目录 异常处理机制流程图 异常处理的两种方式 简单异常处理器SimpleMappingExceptionResolver 自定义异常处理步骤 本章小结 异常处理机制流程图 系统中异常包括两类: 预期异常 通过捕获异常从而获取异常信息. 运行时异常RuntimeException 主要通过规范代码开发.测试等手段减少运行时异常的发生. 系统的Dao.Service.Controller出现都通过throws Exception向上抛出,最后SpringMVC前端控制器交由异常处理器进行异常处理,如

  • 让你五分钟彻底理解Spring MVC

    目录 概述 MVC 架构模式 传统 MVC 架构模式 Java Web MVC 架构模式 Spring MVC 架构模式 Hello,Spring MVC Spring MVC 依赖引入 DispatcherServlet 声明 Spring 上下文配置 Spring 上下文配置文件内容 HandlerMapping 配置 处理器配置 ViewResolver 配置 DispatcherServlet 组件默认配置 基于注解的 Spring WebMVC DispatcherServlet 请求

随机推荐