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

相关文章
|
5天前
|
Java
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
这篇文章是Spring5框架的实战教程,深入讲解了AOP的基本概念、如何利用动态代理实现AOP,特别是通过JDK动态代理机制在不修改源代码的情况下为业务逻辑添加新功能,降低代码耦合度,并通过具体代码示例演示了JDK动态代理的实现过程。
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
|
5天前
|
XML Java 数据格式
Spring5入门到实战------11、使用XML方式实现AOP切面编程。具体代码+讲解
这篇文章是Spring5框架的AOP切面编程教程,通过XML配置方式,详细讲解了如何创建被增强类和增强类,如何在Spring配置文件中定义切入点和切面,以及如何将增强逻辑应用到具体方法上。文章通过具体的代码示例和测试结果,展示了使用XML配置实现AOP的过程,并强调了虽然注解开发更为便捷,但掌握XML配置也是非常重要的。
Spring5入门到实战------11、使用XML方式实现AOP切面编程。具体代码+讲解
|
8天前
|
安全 Java 开发者
Java 新手入门:Spring 两大利器IoC 和 AOP,小白也能轻松理解!
Java 新手入门:Spring 两大利器IoC 和 AOP,小白也能轻松理解!
15 1
|
7天前
|
Java Spring
Spring的AOP组件详解
该文章主要介绍了Spring AOP(面向切面编程)组件的实现原理,包括Spring AOP的基础概念、动态代理模式、AOP组件的实现以及Spring选择JDK动态代理或CGLIB动态代理的依据。
Spring的AOP组件详解
|
20天前
|
Java API Spring
Spring Boot 中的 AOP 处理
对 Spring Boot 中的切面 AOP 做了详细的讲解,主要介绍了 Spring Boot 中 AOP 的引入,常用注解的使用,参数的使用,以及常用 api 的介绍。AOP 在实际项目中很有用,对切面方法执行前后都可以根据具体的业务,做相应的预处理或者增强处理,同时也可以用作异常捕获处理,可以根据具体业务场景,合理去使用 AOP。
|
5天前
|
XML Java 数据库
Spring5入门到实战------10、操作术语解释--Aspectj注解开发实例。AOP切面编程的实际应用
这篇文章是Spring5框架的实战教程,详细解释了AOP的关键术语,包括连接点、切入点、通知、切面,并展示了如何使用AspectJ注解来开发AOP实例,包括切入点表达式的编写、增强方法的配置、代理对象的创建和优先级设置,以及如何通过注解方式实现完全的AOP配置。
|
22天前
|
JSON Java 数据库
Spring Boot中的全局异常处理
主要讲解了Spring Boot 的全局异常处理,包括异常信息的封装、异常信息的捕获和处理,以及在实际项目中,我们用到的自定义异常枚举类和业务异常的捕获与处理,在项目中运用的非常广泛,基本上每个项目中都需要做全局异常处理。
|
23天前
|
JSON Java fastjson
Spring Boot返回Json数据及数据封装
本文详细介绍了如何在Spring Boot项目中处理JSON数据的传输 Spring Boot默认使用Jackson作为JSON处理器,并通过`spring-boot-starter-web`依赖自动包含相关组件。文章还展示了如何配置Jackson处理null值,使其转换为空字符串。此外,文章比较了Jackson和FastJson的特点,并提供了FastJson的配置示例,展示了如何处理null值以适应不同应用场景。
|
23天前
|
Java 测试技术 数据库
Spring Boot中的项目属性配置
本节课主要讲解了 Spring Boot 中如何在业务代码中读取相关配置,包括单一配置和多个配置项,在微服务中,这种情况非常常见,往往会有很多其他微服务需要调用,所以封装一个配置类来接收这些配置是个很好的处理方式。除此之外,例如数据库相关的连接参数等等,也可以放到一个配置类中,其他遇到类似的场景,都可以这么处理。最后介绍了开发环境和生产环境配置的快速切换方式,省去了项目部署时,诸多配置信息的修改。
|
1月前
|
Java 应用服务中间件 开发者
Java面试题:解释Spring Boot的优势及其自动配置原理
Java面试题:解释Spring Boot的优势及其自动配置原理
87 0