Spring AOP【统一异常处理与统一数据格式封装】

简介: Spring AOP【统一异常处理与统一数据格式封装】

🍎一.统一异常处理


统一异常处理:

1、给当前的类上加@ControllerAdvice+@ResponseBody / @RestControllerAdvice.

2、给方法上添加@ExceptionHandler(xxx.class),添加异常返回的业务代码


🍒1.1 实现一个异常方法

@RequestMapping("/user")
@RestController
public class UserController {
    // 算数异常
    @RequestMapping("/index2")
    public String index2() {
        int num = 10/0;
        return "Hello,Index";
    }


当我们没有是实现统一异常处理时页面返回的错误返回给前端是看不懂的,如下:


3018f1a53558454e9bac4c87a3cefe22.png

所有我们要进行统一异常处理返回给前端


🍒1.2 统一处理异常代码的实现


统⼀异常处理使⽤的是 @ControllerAdvice + @ExceptionHandler 来实现的,@ControllerAdvice 表示控制器通知类,@ExceptionHandler 是异常处理器,两个结合表示当出现异常的时候执⾏某个通知,也就是执⾏某个⽅法事件,具体实现代码如下:

// 添加 @ControllerAdvice注解来表示@Controller方法增强(这类里异常)通知方法
//@ControllerAdvice
//@ResponseBody
@RestControllerAdvice //@ControllerAdvice + @ResponseBody
public class MyExceptionAdvice {
    // 算数异常
    @ExceptionHandler(ArithmeticException.class)
    public HashMap<String,Object> arithemeticExceptionAdvice(ArithmeticException e){
        HashMap<String,Object> result = new HashMap<>();
        result.put("state",-1);
        result.put("data",null);
        result.put("mag","算数异常:" + e.getMessage());
        return result;
    }


以上⽅法表示,如果出现了异常就返回给前端⼀个 HashMap 的对象,其中包含的字段如代码中定义的那样

这时我们就可以通过异常处理来返回一个JSON对象给前端了

15aeedd35b8d41339a8267a009b6820d.png


🍒1.3 统一处理所有异常


我们发现在我们处理异常时,需要手动处理多处不同异常情况,这样会使我们消耗大量时间,并且还有些不可控的异常


// 添加 @ControllerAdvice注解来表示@Controller方法增强(这类里异常)通知方法
//@ControllerAdvice
//@ResponseBody
@RestControllerAdvice //@ControllerAdvice + @ResponseBody
public class MyExceptionAdvice {
    // 算数异常
    @ExceptionHandler(ArithmeticException.class)
    public HashMap<String,Object> arithemeticExceptionAdvice(ArithmeticException e){
        HashMap<String,Object> result = new HashMap<>();
        result.put("state",-1);
        result.put("data",null);
        result.put("mag","算数异常:" + e.getMessage());
        return result;
    }
  // 空指针异常
    @ExceptionHandler(NullPointerException.class)
    public HashMap<String,Object> nullPointerExceptionAdvice(NullPointerException e){
        HashMap<String,Object> result = new HashMap<>();
        result.put("state",-1);
        result.put("data",null);
        result.put("mag","空指针异常:" + e.getMessage());
        return result;
    }


所有我们可以在处理完特殊异常后,在统一使用Exception 来进行处理

// 添加 @ControllerAdvice注解来表示@Controller方法增强(这类里异常)通知方法
//@ControllerAdvice
//@ResponseBody
@RestControllerAdvice //@ControllerAdvice + @ResponseBody
public class MyExceptionAdvice {
    // 算数异常
    @ExceptionHandler(ArithmeticException.class)
    public HashMap<String,Object> arithemeticExceptionAdvice(ArithmeticException e){
        HashMap<String,Object> result = new HashMap<>();
        result.put("state",-1);
        result.put("data",null);
        result.put("mag","算数异常:" + e.getMessage());
        return result;
    }
  // 空指针异常
    @ExceptionHandler(NullPointerException.class)
    public HashMap<String,Object> nullPointerExceptionAdvice(NullPointerException e){
        HashMap<String,Object> result = new HashMap<>();
        result.put("state",-1);
        result.put("data",null);
        result.put("mag","空指针异常:" + e.getMessage());
        return result;
    } 
   // 统一处理其他异常
 @ExceptionHandler(Exception.class)
    public HashMap<String,Object> exceptionAdvice(Exception e){
        HashMap<String,Object> result = new HashMap<>();
        result.put("state",-1);
        result.put("data",null);
        result.put("mag","异常:" + e.getMessage());
        return result;
    }


🍎二.统一格式封装

🍒2.1 实现一个返回数据方法

@RequestMapping("/user")
@RestController
 // 登陆页面
    @RequestMapping("/login")
    public boolean login(HttpServletRequest request,String username, String password){
        boolean result = false;
        // 判断是否在登陆页面输入账号 和 密码
        if (StringUtils.hasLength(username) && StringUtils.hasLength(password)){
            // 验证输入的账号 和 密码 是否正确
            if (username.equals("admin") && password.equals("admin")){
                // 判断输入的账号和密码正确后 建立一个 session对象进行存储
                HttpSession session = request.getSession();
                session.setAttribute("userinfo","userinfo");
                return  true;
            }
        }
        return  result;
    }


🍒2.2 统一处理数据格式封装


统一数据格式封装:

1、给当前类添加@ControllerAdvice。

2、实现 ResponseBodyAdvice重写其方法

package com.example.demo.config;
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;
@ControllerAdvice
public class MyResponseAdvice implements ResponseBodyAdvice {
    /**
     * 返回一个boolean 值,true 表示放回数据之前对数据进行重写 ,也就会进入 beforeBodyWrite 方法
     *  如果返回 false 表示对结果不进行任何处理,直接返回
     */
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return false;
    }
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        HashMap<String,Object> result = new HashMap<>();
        result.put("state",1);
        result.put("data",body);
        result.put("msg","");
        return result;
    }
}

🍒2.3 验证格斯封装


b54c6a0f785e47ab8daf2bf3979b8680.png



3982017756bc4e6ab15b2f86dc131589.jpg

相关文章
|
1月前
|
XML Java 测试技术
Spring AOP—通知类型 和 切入点表达式 万字详解(通俗易懂)
Spring 第五节 AOP——切入点表达式 万字详解!
119 25
|
1月前
|
XML 安全 Java
Spring AOP—深入动态代理 万字详解(通俗易懂)
Spring 第四节 AOP——动态代理 万字详解!
91 24
|
2月前
|
XML Java 开发者
Spring Boot中的AOP实现
Spring AOP(面向切面编程)允许开发者在不修改原有业务逻辑的情况下增强功能,基于代理模式拦截和增强方法调用。Spring Boot通过集成Spring AOP和AspectJ简化了AOP的使用,只需添加依赖并定义切面类。关键概念包括切面、通知和切点。切面类使用`@Aspect`和`@Component`注解标注,通知定义切面行为,切点定义应用位置。Spring Boot自动检测并创建代理对象,支持JDK动态代理和CGLIB代理。通过源码分析可深入了解其实现细节,优化应用功能。
136 6
|
2月前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
101 8
|
4月前
|
监控 安全 Java
什么是AOP?如何与Spring Boot一起使用?
什么是AOP?如何与Spring Boot一起使用?
121 5
|
4月前
|
开发框架 Java UED
如何使用 Spring Boot 实现异常处理
如何使用 Spring Boot 实现异常处理
126 2
|
4月前
|
XML 监控 安全
深入调查研究Spring AOP
【11月更文挑战第15天】
67 5
|
4月前
|
Java 开发者 Spring
Spring AOP 底层原理技术分享
Spring AOP(面向切面编程)是Spring框架中一个强大的功能,它允许开发者在不修改业务逻辑代码的情况下,增加额外的功能,如日志记录、事务管理等。本文将深入探讨Spring AOP的底层原理,包括其核心概念、实现方式以及如何与Spring框架协同工作。
|
20天前
|
Java 数据库 开发者
详细介绍SpringBoot启动流程及配置类解析原理
通过对 Spring Boot 启动流程及配置类解析原理的深入分析,我们可以看到 Spring Boot 在启动时的灵活性和可扩展性。理解这些机制不仅有助于开发者更好地使用 Spring Boot 进行应用开发,还能够在面对问题时,迅速定位和解决问题。希望本文能为您在 Spring Boot 开发过程中提供有效的指导和帮助。
70 12
|
23天前
|
Java 应用服务中间件 Maven
SpringBoot项目打包成war包
通过上述步骤,我们成功地将一个Spring Boot应用打包成WAR文件,并部署到外部的Tomcat服务器中。这种方式适用于需要与传统Servlet容器集成的场景。
41 8