SpringBoot统一功能处理的方式详解

目录
  • SpringMVC统一处理的三种方式
    • 1、基于SpringMVC的配置类扩展
    • 2、统一的响应数据格式封装
    • 3、统一异常处理

基于SpringAOP已经实现统一功能增强,但如果希望对Controller增强,就无法获取其中的http请求数据。因此,实现以下这些统一增强的业务,就不能使用SpringAOP:

  • 响应数据统一封装
  • 统一异常处理(返回错误信息的http响应)
  • http请求日志记录

SpringMVC统一处理的三种方式

SpringMVC在SpringBoot项目中,是默认进行了配置,同时也提供了自定义的配置方式。

1、基于SpringMVC的配置类扩展

如:

(1)添加路径前缀

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        //对Controller中的路径,添加前缀
        //需要注意:添加前缀后,之后进行资源访问也需要添加前缀
        //第一个参数:要添加的前缀,第二个参数:用于锅炉Controller中的方法
        configurer.addPathPrefix("api",(c)->true);
    }

(2)添加拦截器

添加Controller的方法拦截器=>对请求映射方法进行统一增强。

web开发中的三大组件:过滤器、拦截器、监听器。

拦截器:

对web请求和响应进行拦截,然后可以统一处理;

Spring中,包含两种拦截器:

  • HandlerInterceptor:专门做SpringMVC请求和响应的拦截;
  • MethodInterceptor:对方法进行拦截,是SpringAOP的一种实现。

拦截器的实现原理:

HandlerInterceptor的实现原理:SpringMVC是基于框架实现了一个顶级的Servlet:DispatcherServlet,里面封装了很多逻辑,其中包括HandlerInterceptor的逻辑。是基于代码设计上的实现=>不是动态代理!!!

MethodInterceptor实现原理:基于动态代理。

2、统一的响应数据格式封装

使用@ControllerAdvice+ResponseBodyAdvice的方式实现。

import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

import java.util.HashMap;
import java.util.Map;

@ControllerAdvice
//注解是对Controller进行增强(SpringMVC代码设计)
public class ResponseAdvice implements ResponseBodyAdvice {
    //方法的返回值表示是否要对请求映射方法增强
    //两个方法参数,可以筛选controller中的请求映射方法
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return false;
    }
    //增强的逻辑:http返回的响应,基于方法的返回值来设置响应体body
    //第一个方法参数body,是请求映射方法的返回值
    //调用登录接口,返回map对象(ok=false,msg=xxx),就是body方法参数
    @Override
    public Object beforeBodyWrite(Object body,
                                  MethodParameter returnType,
                                  MediaType selectedContentType,
                                  Class selectedConverterType,
                                  ServerHttpRequest request,
                                  ServerHttpResponse response) {
        //构造一个统一的返回格式
        Map<String,Object> map =new HashMap<>();
        map.put("success",true);
        map.put("data",body);
        return map;
    }
}

3、统一异常处理

Controller请求映射方法,如果抛异常,由统一异常处理的代码来执行。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;

//统一异常处理
@Controller
public class ExceptionAdvice {

    //使用@ExceptionHandler注解,可以设置要补货的Controller请求映射方法抛出的异常类
    @ExceptionHandler(Exception.class)
    //方法的写法,和Controller请求映射方法的写法类似
    //如果返回json就使用@ResponseBody,如果返回网页,就返回资源路径的字符串
    @ResponseBody
    public Object handle(Exception e,
                         HttpServletResponse){
        HashMap<String, Object>  map= new HashMap<>();
        map.put("success", 0);
        map.put("status", 1);
        map.put("msg", e.getMessage());
        return map;
    }

}

到此这篇关于SpringBoot统一功能处理的方式详解的文章就介绍到这了,更多相关SpringBoot统一功能处理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot 统一异常处理详解

    代码结构 配置pom文件 <?xml version="1.0" encoding="UTF-8"?> <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/

  • SpringBoot接口如何统一异常处理

    目录 为什么要优雅的处理异常 实现案例 @ControllerAdvice异常统一处理 Controller接口 运行测试 进一步理解 @ControllerAdvice还可以怎么用? @ControllerAdvice是如何起作用的(原理)? 为什么要优雅的处理异常 如果我们不统一的处理异常,经常会在controller层有大量的异常处理的代码, 比如: @Slf4j @Api(value = "User Interfaces", tags = "User Interfac

  • SpringBoot中如何统一接口返回与全局异常处理详解

    目录 背景 统一接口返回 定义API返回码枚举类 定义正常响应的API统一返回体 定义异常响应的API统一返回体 编写包装返回结果的自定义注解 定义返回结果拦截器 WebMvc配置类拦截器注册者添加返回结果拦截器 编写响应体处理器 接口调用 测试结果 全局异常处理 编写自定义异常基类 编写自定义业务异常类 定义全局异常处理类 接口调用 测试结果 总结 背景 在分布式.微服务盛行的今天,绝大部分项目都采用的微服务框架,前后端分离方式.前端和后端进行交互,前端按照约定请求URL路径,并传入相关参数,

  • Springboot项目异常处理及返回结果统一

    目录 背景 返回结果定义 异常的定义 异常的处理 返回结果的处理 完整代码 使用示例 背景 在创建项目的初期,我们需要规范后端返回的数据结构,以便更好地与前端开发人员合作. 比如后端返回的数据为: {  "msg": "请跳转登陆页面", } 此时前端无法确定后端服务的处理结果是成功的还是失败的.在前端展示页面,成功与失败的展示是要作区分的,甚至不同的成功或失败结果要做出不同的展现效果,这也就是我们为什么要对返回结果做出统一规范的原因. 返回结果定义 public

  • SpringBoot中如何进行统一异常处理

    目录 1.处理前 2.进行系统异常全局处理 3.进行自定义异常处理 总结 如何在SpringBoot项目里进行统一异常处理 需要了解的知识 @ControllerAdvice的作用 1.处理前 异常代码 /** * 根据id获取医院设置 * * @param id 查看的id编号 * @return */ @ApiOperation(value = "根据id获取医院设置") @GetMapping("/findHospById/{id}") public Resu

  • SpringBoot处理全局统一异常的实现

    在后端发生异常或者是请求出错时,前端通常显示如下 Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Fri Jun 07 15:38:07 CST 2019 There was an unexpected error (type=Not Found, status=404). No message available 对于

  • SpringBoot统一功能处理的方式详解

    目录 SpringMVC统一处理的三种方式 1.基于SpringMVC的配置类扩展 2.统一的响应数据格式封装 3.统一异常处理 基于SpringAOP已经实现统一功能增强,但如果希望对Controller增强,就无法获取其中的http请求数据.因此,实现以下这些统一增强的业务,就不能使用SpringAOP: 响应数据统一封装 统一异常处理(返回错误信息的http响应) http请求日志记录 SpringMVC统一处理的三种方式 SpringMVC在SpringBoot项目中,是默认进行了配置,

  • SpringBoot统一返回格式的方法详解

    目录 前言 1. 直接返回结果 2. 约定返回格式 3. 返回统一格式结果 4. 切片封装统一格式 编写注解 编写ControllerAdvice 见证奇迹的时刻到了 5. 自定义返回格式 场景1:返回成功时code为200 场景2:自定义返回格式 前言 目前很多项目都是前后端分离,前后端会事先约定好返回格式.那么后端如何做,才能优雅的返回统一格式呢,接下来,请大家跟着我,一步步来实现. 1. 直接返回结果 先看一下最基本的例子,直接将结果原封不动返回: @Data @AllArgsConstr

  • SpringBoot与Dubbo整合的方式详解

    1. 使用默认application.properties和注解的方式 导入dubbo-starter,在application.properties配置属性,使用@Service注解来暴露服务,使用@Reference来引用服务.具体可参考 Dubbo整合SpringBoot,这里截取部分代码方便理解. 属性在application.properties中配置 服务提供方使用@Service注解暴露服务 部分配置如"timeout"等可以在注解上添加 服务消费方使用@Referenc

  • springboot 注册服务注册中心(zk)的两种方式详解

    在使用springboot进行开发的过程中,我们经常需要处理这样的场景:在服务启动的时候,需要向服务注册中心(例如zk)注册服务状态,以便当服务状态改变的时候,可以故障摘除和负载均衡. 我遇到过两种注册的途径: 1.在Spring的webapplication启动完成后,直接进行注册: 2.在servlet容器启动完成后,通过listener进行注册. 本文通过一个demo讲述一下这两种注册方式,使用的是传统的向zk注册的方案. 1.Spring webapplication启动完成后注册 先上

  • SpringBoot使用AOP统一日志管理的方法详解

    目录 前言 实现 1.引入依赖 2.定义logback配置 3.编写切面类 4.测试 前言 请问今天您便秘了吗?程序员坐久了真的会便秘哦,如果偶然点进了这篇小干货,就麻烦您喝杯水然后去趟厕所一边用左手托起对准嘘嘘,一边用右手滑动手机看完本篇吧. 实现 本篇AOP统一日志管理写法来源于国外知名开源框架JHipster的AOP日志管理方式 1.引入依赖 <!-- spring aop --> <dependency> <groupId>org.springframework

  • SpringBoot中@Autowired生效方式详解

    目录 前言 正文 注册AutowiredProcessor的BeanDefinition 实例化AutowiredProcessor 创建bean时进行注入 后记 前言 @Component public class SimpleBean3 { @Autowired private SimpleBean simpleBean; } @Autowired修饰的字段会被容器自动注入.那么Spring Boot中使如何实现这一功能呢? AutowiredAnnotationBeanPostProces

  • SpringBoot项目jar和war打包部署方式详解

    目录 jar与war jar包部署运行 war包部署运行 jar与war Spring Boot项目开发完成后,需要以jar或war的方式将项目打包部署到测试开发环境. jar即Java Archive,是Java归档文件,该文件格式与平台无关,它允许将许多文件组合成一个压缩文件.Java程序都可以打成jar包,目前Docker广泛使用,Java项目都会打成可执行的jar包,最终构建为镜像文件来运行. jar文件格式基于流行的ZIP文件格式.与ZIP文件不同的是,jar文件不仅用于压缩和发布,而

  • 微信小程序 支付功能实现PHP实例详解

    微信小程序 支付功能实现PHP实例详解 前端代码: wx.request({ url: 'https://www.yourhost.com/weixin/WeiActivity/payJoinfee',//改成你自己的链接 header: { 'Content-Type': 'application/x-www-form-urlencoded' }, method:'POST', success: function(res) { console.log(res.data); console.lo

  • IntelliJ Idea SpringBoot 数据库增删改查实例详解

    SpringBoot 是 SpringMVC 的升级,对于编码.配置.部署和监控,更加简单 微服务 微服务是一个新兴的软件架构,就是把一个大型的单个应用程序和服务拆分为数十个的支持微服务.一个微服务的策略可以让工作变得更为简便,它可扩展单个组件而不是整个的应用程序堆栈,从而满足服务等级协议. Spring 为 微服务提供了一整套的组件-SpringClound , SpirngBoot 就是该基础. 第一个SpringBoot程序 这里使用的开发软件是IntelliJ Idea,和Eclipse

  • 使用SpringBoot整合ssm项目的实例详解

    SpringBoot是什么? Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程. Spring Boot 现在已经成为 Java 开发领域的一颗璀璨明珠,它本身是包容万象的,可以跟各种技术集成.成为 SpringBoot 全家桶,成为一把万能钥匙. SpringBoot的特点 1.创建独立的 Spring 应用程序 2.嵌入的 Tomcat ,无需部署 WAR 文件 3.简化 Maven 配置 4.自动配置 Spr

随机推荐