【Spring Boot统一功能处理】统一异常处理,统一的返回格式,@ControllerAdvice简单分析,即将走进SSM项目的大门! ! !

这篇具有很好参考价值的文章主要介绍了【Spring Boot统一功能处理】统一异常处理,统一的返回格式,@ControllerAdvice简单分析,即将走进SSM项目的大门! ! !。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:
大家好,我是良辰丫,在上一篇文章中我们已经学习了一些统一功能处理的相关知识,今天我们继续深入学习这些知识,主要学习统一异常处理,统一的返回格式,@ControllerAdvice简单分析.💌💌💌

🧑个人主页:良辰针不戳
📖所属专栏:javaEE进阶篇之框架学习
🍎励志语句:生活也许会让我们遍体鳞伤,但最终这些伤口会成为我们一辈子的财富。
💦期待大家三连,关注,点赞,收藏。
💌作者能力有限,可能也会出错,欢迎大家指正。
💞愿与君为伴,共探Java汪洋大海。

【Spring Boot统一功能处理】统一异常处理,统一的返回格式,@ControllerAdvice简单分析,即将走进SSM项目的大门! ! !,【JavaEE学习】进阶篇之java框架,spring boot,python,后端

1. 统一异常处理

1.1 制造一个算术异常

我们首先来制造一个算术异常,除数不能为0.

   @RequestMapping("/login")
    public String login(){
        int num = 10/0;
        return "执行了login";
    }

我们先不用处理异常,观察我们的浏览器效果.

【Spring Boot统一功能处理】统一异常处理,统一的返回格式,@ControllerAdvice简单分析,即将走进SSM项目的大门! ! !,【JavaEE学习】进阶篇之java框架,spring boot,python,后端

1.2 处理异常

  • 创建一个类,在类上标识注解@ControllerAdvice,这个注解可以感知异常.
  • 通过注解 @ExceptionHandler来订阅异常

package com.example.demo;


import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;

@ResponseBody
@ControllerAdvice
public class ExDeal {
    @ExceptionHandler(ArithmeticException.class)
    public HashMap<String, String> arithmeticException(ArithmeticException e) {
        HashMap<String, String> result = new HashMap<>();
        result.put("code", "-1");
        result.put("msg", "算术异常异常:" + e.getMessage()); // 错误码的描述信息
        result.put("data", "除数不能为0");
        return result;
    }
}

Exception包含所有的异常,参数写成Exception也可以,注意是方法的参数.

接下来我们观察浏览器效果.

【Spring Boot统一功能处理】统一异常处理,统一的返回格式,@ControllerAdvice简单分析,即将走进SSM项目的大门! ! !,【JavaEE学习】进阶篇之java框架,spring boot,python,后端

2. 统一的返回格式

注意 : 我们在上一篇文章学习了拦截器,我们制定了一些拦截规则,我们一会要举一个例子进行测试我们的统一的返回格式,因此我们可以先把拦截器的代码注释掉.

2.1 为什么需要统一返回格式呢?

  • ⽅便前端程序员更好的接收和解析后端数据接⼝返回的数据。
  • 降低前端程序员和后端程序员的沟通成本,按照某个格式实现就⾏了,因为所有接⼝都是这样返回的。
  • 有利于项⽬统⼀数据的维护和修改。
  • 有利于后端技术部⻔的统⼀规范的标准制定,不会出现稀奇古怪的返回内容。
  • 也就是前后端做出格式约定,可以极大的方便程序员去处理各种各样的问题,格式不统一会有格式转换等不便捷的缺点,也不利于程序员维护.

2.2 写一个随机返回数函数

我们先在user类中写一个随机返回数字代码,运行通过浏览器观察效果.

@RequestMapping("/num")
public Integer num(){
    Random random = new Random();
    int num = random.nextInt(1000);
    return num;
}

【Spring Boot统一功能处理】统一异常处理,统一的返回格式,@ControllerAdvice简单分析,即将走进SSM项目的大门! ! !,【JavaEE学习】进阶篇之java框架,spring boot,python,后端
然而后端并不知道我们的格式,因为我们可能是字符串,整型等各种各样的数据类型.

2.3 创建一个类并且添加@ControllerAdvice

package com.example.demo;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

@ControllerAdvice
public class Respons {

   }

2.4 实现ResponseBodyAdvice接口并重写方法

我们要实现ResponseBodyAdvice接口,并且重写supports方法以及beforeBodyWrite方法(统一对象急速在此方法中实现的)

package com.example.demo;

import org.springframework.core.MethodParameter;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
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.RequestBodyAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

import java.io.IOException;
import java.lang.reflect.Type;
import java.util.HashMap;

@ControllerAdvice
public class Response implements ResponseBodyAdvice {
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        //默认是false,表示开关关掉,意味着下面的重写效果没有用途
//        return false;
        //返回true的时候才会执行下面的beforeBodyWrite方法
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        HashMap<String,Object> map = new HashMap<>();
        //添加状态码,200表示成功
        map.put("code","200");
        //错误的描述信息
        map.put("msg",null);
        //数据body
        map.put("data",body);
        return map;
    }
}

然后我们观察统一格式后的效果

【Spring Boot统一功能处理】统一异常处理,统一的返回格式,@ControllerAdvice简单分析,即将走进SSM项目的大门! ! !,【JavaEE学习】进阶篇之java框架,spring boot,python,后端

2.5 返回格式处理String类型出现问题

我们在login中返回的是一个字符串,当我们通过浏览器访问我们的login页面的时候会发现有一定的问题,错误是不能进行类型转化,这是为什么呢?

【Spring Boot统一功能处理】统一异常处理,统一的返回格式,@ControllerAdvice简单分析,即将走进SSM项目的大门! ! !,【JavaEE学习】进阶篇之java框架,spring boot,python,后端

  • String既不属于基本数据类型,又不属于对象.
  • String使用的是自己的格式化工具,我们需要使用jackon进行类型转换.
  • 因此如果是String需要特殊处理,我们先要通过属性注入把ObjectMapper注入进来,因为处理String需要这个方法.
package com.example.demo;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
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.RequestBodyAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

import java.io.IOException;
import java.lang.reflect.Type;
import java.util.HashMap;

@ControllerAdvice
public class Response implements ResponseBodyAdvice {

    @Autowired
    private ObjectMapper objectMapper;
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        //默认是false,表示开关关掉,意味着下面的重写效果没有用途
//        return false;
        //返回true的时候才会执行下面的beforeBodyWrite方法
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        HashMap<String,Object> map = new HashMap<>();
        //添加状态码,200表示成功
        map.put("code","200");
        //错误的描述信息
        map.put("msg",null);
        //数据body
        map.put("data",body);

        if (body instanceof String) {
            // 需要特殊处理,因为 String 在转换的时候会报错
            try {
                return objectMapper.writeValueAsString(map);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
        }
        return map;
    }
}

接下来我们再次观察我们的浏览器页面效果.

【Spring Boot统一功能处理】统一异常处理,统一的返回格式,@ControllerAdvice简单分析,即将走进SSM项目的大门! ! !,【JavaEE学习】进阶篇之java框架,spring boot,python,后端

3. @ControllerAdvice简单分析

  1. 我们先进入 @ControllerAdvice源码中,我们惊奇的发现@ControllerAdvice也是来自于组件@Component.⽽所有组件初始化都会调⽤InitializingBean 接⼝。

【Spring Boot统一功能处理】统一异常处理,统一的返回格式,@ControllerAdvice简单分析,即将走进SSM项目的大门! ! !,【JavaEE学习】进阶篇之java框架,spring boot,python,后端

  1. 接下来我们来看 InitializingBean 有哪些实现类?在资料中我们发现 Spring MVC中的实现⼦类是 RequestMappingHandlerAdapter,我们找到一个initControllerAdviceCache方法.

【Spring Boot统一功能处理】统一异常处理,统一的返回格式,@ControllerAdvice简单分析,即将走进SSM项目的大门! ! !,【JavaEE学习】进阶篇之java框架,spring boot,python,后端

【Spring Boot统一功能处理】统一异常处理,统一的返回格式,@ControllerAdvice简单分析,即将走进SSM项目的大门! ! !,【JavaEE学习】进阶篇之java框架,spring boot,python,后端

【Spring Boot统一功能处理】统一异常处理,统一的返回格式,@ControllerAdvice简单分析,即将走进SSM项目的大门! ! !,【JavaEE学习】进阶篇之java框架,spring boot,python,后端

  • 我们发现这个⽅法在执⾏是会查找使⽤所有的 @ControllerAdvice 类,发⽣某个事件时,调⽤相应的 Advice ⽅法,⽐如返回数据前调⽤统⼀数据封装,⽐如发⽣异常是调⽤异常的Advice ⽅法实现。
  • 换句话来说,就是有各种各样的Advice来处理不同的事件,如果出现了异常事件就会通过@ControllerAdvice注解调用异常事件相关的Advice进行检测异常(就是定位异常),然后通过我们的后端代码处理异常.

后序:
在Spring Boot统一功能处理我们主要学习了统一用户登录权限验证,统一数据格式返回,统一异常处理,这些都是在我们的SSM项目中非常重要的,我们需要重点去掌握.🚀🚀🚀文章来源地址https://www.toymoban.com/news/detail-565542.html

到了这里,关于【Spring Boot统一功能处理】统一异常处理,统一的返回格式,@ControllerAdvice简单分析,即将走进SSM项目的大门! ! !的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot统一异常处理和统一返回格式

    上篇博客我们讲解了使用AOP来进行统一的用户登录判断,其实像这种功能统一且使用较多的地方,都可以用AOP来处理,除了统⼀的⽤户登录判断之外,AOP 还可以实现: 统⼀⽇志记录 统⼀⽅法执⾏时间统计 (在性能优化阶段,监控流量,接口的响应时间等甚至每个方法的响应

    2024年02月15日
    浏览(28)
  • springboot优雅的统一返回格式 + 全局异常处理(包括404等异常)

    目录 1.自定义枚举类 2.自定义统一返回格式类 3.统一返回格式的高级实现 4.全局异常处理 5.更优雅的全局异常处理 6.处理404错误 该枚举类为我们和前端约定好的返回状态码和描述信息,可根据自己的需求修改状态码和描述 @Data 注解为Lombok工具类库中的注解,提供类的get、s

    2024年02月11日
    浏览(34)
  • 一站式统一返回值封装、异常处理、异常错误码解决方案—最强的Sping Boot接口优雅响应处理器

    作者:京东物流 覃玉杰 Graceful Response是一个Spring Boot体系下的优雅响应处理器,提供一站式统一返回值封装、异常处理、异常错误码等功能。 使用Graceful Response进行web接口开发不仅可以节省大量的时间,还可以提高代码质量,使代码逻辑更清晰。 强烈推荐你花3分钟学会它!

    2024年02月03日
    浏览(47)
  • Spring Boot实现统一异常处理的技术解析

    引言 在软件开发过程中,异常处理是非常重要的一环。一个好的异常处理机制可以帮助我们更好地定位问题,提高代码的可维护性和稳定性。Spring Boot作为一款轻量级的Java开发框架,提供了一种简单而高效的方式来实现统一异常处理。本文将详细介绍如何使用Spring Boot实现统

    2024年01月21日
    浏览(33)
  • 【Spring Boot 】Spring Boot 统一功能处理

    🎉🎉🎉 点进来你就是我的人了 博主主页: 🙈🙈🙈 戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔 🤺🤺🤺 目录 前言 1. Spring 拦截器 1.1 自定义拦截器 1.2 将自定义拦截器加入到系统配置中 1.3 拦截器实现原理 统一访问前缀添加 (扩展) 2. 统一异常的处理 (@Co

    2024年02月09日
    浏览(30)
  • Spring Boot 统一功能处理

    ✏️作者:银河罐头 📋系列专栏:JavaEE 🌲 “种一棵树最好的时间是十年前,其次是现在” Spring Boot 统⼀功能处理模块,也是 AOP 的实战环节。 Spring 中提供了具体的实现拦截器:HandlerInterceptor,拦截器的实现分为以下两个步 骤: 创建⾃定义拦截器,实现 HandlerInterceptor 接

    2024年02月08日
    浏览(35)
  • Spring Boot 系列4 -- 统一功能处理

    目录 前言 1. Spring AOP 用户统⼀登录验证的问题 1.1 自定义拦截器 1.2 配置拦截器并配置拦截的规则 1.3 拦截器的原理源码分析 2. 统一异常处理 2.1 实现统一异常处理 2.2 测试统一异常处理 3. 统一的数据格式返回 3.1 统⼀数据返回格式的实现 3.2 测试统一的数据返回         S

    2024年02月14日
    浏览(31)
  • Spring Boot统一处理功能——拦截器

    ⽤户登录权限的发展从之前每个⽅法中⾃⼰验证⽤户登录权限,到现在统⼀的⽤户登录验证处理,它是⼀个逐渐完善和逐渐优化的过程。 我们先来回顾⼀下最初⽤户登录验证的实现⽅法: 从上述代码可以看出,每个⽅法中都有相同的⽤户登录验证权限,它的缺点是: 1. 每个

    2024年02月13日
    浏览(29)
  • 【Spring Boot】拦截器与统一功能处理

    博主简介:想进大厂的打工人 博主主页: @xyk: 所属专栏: JavaEE进阶   上一篇文章我们讲解了Spring AOP是一个基于面向切面编程的框架,用于将某方面具体问题集中处理,通过代理对象来进行传递,但使用原生Spring AOP实现统一的拦截是非常繁琐的。而在本节,我们将使用一种

    2024年02月14日
    浏览(34)
  • Spring MVC学习随笔-Ajax集成(JSON格式返回数据)、拦截器(MyInterceptor)、全局异常处理(GlobalExceptionResolver)

    学习视频:【编程不良人】继spring之后快速入门springmvc,面对SpringMVC不用慌 引入相关依赖 开发控制器 日期格式修正 可以正常响应 拦截器 :Interceptor 拦截 中断 类似于javaweb中的Filter,不过没有Filter那么强大 作用 Spring MVC的拦截器是一种用于在请求处理过程中进行预处理和后处

    2024年02月05日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包