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

相关文章
|
8天前
|
XML Java 数据安全/隐私保护
Spring Aop该如何使用
本文介绍了AOP(面向切面编程)的基本概念和术语,并通过具体业务场景演示了如何在Spring框架中使用Spring AOP。文章详细解释了切面、连接点、通知、切点等关键术语,并提供了完整的示例代码,帮助读者轻松理解和应用Spring AOP。
Spring Aop该如何使用
|
28天前
|
存储 缓存 Java
Spring高手之路23——AOP触发机制与代理逻辑的执行
本篇文章深入解析了Spring AOP代理的触发机制和执行流程,从源码角度详细讲解了Bean如何被AOP代理,包括代理对象的创建、配置与执行逻辑,帮助读者全面掌握Spring AOP的核心技术。
34 3
Spring高手之路23——AOP触发机制与代理逻辑的执行
|
13天前
|
Java Spring
[Spring]aop的配置与使用
本文介绍了AOP(面向切面编程)的基本概念和核心思想。AOP是Spring框架的核心功能之一,通过动态代理在不修改原代码的情况下注入新功能。文章详细解释了连接点、切入点、通知、切面等关键概念,并列举了前置通知、后置通知、最终通知、异常通知和环绕通知五种通知类型。
26 1
|
9天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
21 0
|
1月前
|
Java 编译器 Spring
Spring AOP 和 AspectJ 的区别
Spring AOP和AspectJ AOP都是面向切面编程(AOP)的实现,但它们在实现方式、灵活性、依赖性、性能和使用场景等方面存在显著区别。‌
65 2
|
1月前
|
Java Spring 容器
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
126 9
|
1月前
|
XML Java 数据格式
Spring的IOC和AOP
Spring的IOC和AOP
45 0
|
2月前
Micronaut AOP与代理机制:实现应用功能增强,无需侵入式编程的秘诀
AOP(面向切面编程)能够帮助我们在不修改现有代码的前提下,为应用程序添加新的功能或行为。Micronaut框架中的AOP模块通过动态代理机制实现了这一目标。AOP将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,提高模块化程度。在Micronaut中,带有特定注解的类会在启动时生成代理对象,在运行时拦截方法调用并执行额外逻辑。例如,可以通过创建切面类并在目标类上添加注解来记录方法调用信息,从而在不侵入原有代码的情况下增强应用功能,提高代码的可维护性和可扩展性。
61 1
|
15天前
|
安全 Java 编译器
什么是AOP面向切面编程?怎么简单理解?
本文介绍了面向切面编程(AOP)的基本概念和原理,解释了如何通过分离横切关注点(如日志、事务管理等)来增强代码的模块化和可维护性。AOP的核心概念包括切面、连接点、切入点、通知和织入。文章还提供了一个使用Spring AOP的简单示例,展示了如何定义和应用切面。
49 1
什么是AOP面向切面编程?怎么简单理解?
|
19天前
|
XML Java 开发者
论面向方面的编程技术及其应用(AOP)
【11月更文挑战第2天】随着软件系统的规模和复杂度不断增加,传统的面向过程编程和面向对象编程(OOP)在应对横切关注点(如日志记录、事务管理、安全性检查等)时显得力不从心。面向方面的编程(Aspect-Oriented Programming,简称AOP)作为一种新的编程范式,通过将横切关注点与业务逻辑分离,提高了代码的可维护性、可重用性和可读性。本文首先概述了AOP的基本概念和技术原理,然后结合一个实际项目,详细阐述了在项目实践中使用AOP技术开发的具体步骤,最后分析了使用AOP的原因、开发过程中存在的问题及所使用的技术带来的实际应用效果。
47 5