栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot 基于Aop 封装全局请求响应

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot 基于Aop 封装全局请求响应

场景:今天查看本地的SpringBoot的项目,发现 后台请求没有做统一响应,于是我想基于Spring Aop 对Controller层做一层全局请求响应封装。

添加相关Jar包依赖:


        
            org.springframework.boot
            spring-boot-starter-aop
        

相关功能代码片段:

统一请求响应结构体实体对象定义

package com.zzg.common.vo;

import cn.hutool.http.HttpStatus;
import com.zzg.enums.ResultCode;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Response  implements java.io.Serializable{
    private int code;

    private String msg;

    private T data;

    public static  Response error(int code, String msg, T data){
        return new Response(code, msg, data);
    }

    public static  Response error(String msg){
        return new Response(ResultCode.FAIL.getVal(), msg, null);
    }

    public static  Response success(T data){
        return new Response(ResultCode.SUCCESS.getVal(), ResultCode.SUCCESS.getMsg(), data);
    }

    public static  Response success(String msg){
        return new Response(ResultCode.SUCCESS.getVal(), msg, null);
    }

    public static  Response success(String msg, T data){
        return new Response(ResultCode.SUCCESS.getVal(), msg, data);
    }

    @Override
    public String toString() {
        return "Response{" +
                "code='" + code + ''' +
                ", message='" + msg + ''' +
                ", data=" + data +
                '}';
    }


}

请求枚举状态值定义:

package com.zzg.enums;

public enum ResultCode implements java.io.Serializable {

    
    SUCCESS(200, "成功"),

    
    FAIL(500, "操作失败"),

    
    NullpointerException(500, "空指针异常"),

    
    TokenExpire(500,"token失效 ");

  
    ResultCode(int value, String msg){
        this.val = value;
        this.msg = msg;
    }

    public int val() {
        return val;
    }

    public String msg() {
        return msg;
    }

    private int val;
    private String msg;

    public int getVal() {
        return val;
    }

    public void setVal(int val) {
        this.val = val;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

aop 封装请求统一响应:

package com.zzg.aop;

import com.zzg.common.vo.Response;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;



@Aspect
@Component
public class ResponseAop {

    
    @Pointcut("execution(* com.zzg.controller..*.*(..))")
    public void httpResponseAop(){

    }

    //环切
    @Around("httpResponseAop()")
    public Response handlerController(ProceedingJoinPoint proceedingJoinPoint) {
        Response result = null;
        try {
            //获取方法的执行结果
            Object proceed = proceedingJoinPoint.proceed();
            //如果方法的执行结果是Result,则将该对象直接返回
            if (proceed instanceof Response) {
                result = (Response) proceed;
            } else {
                //否则,就要封装到Result的data中
                result =Response.success(proceed);
            }
        }  catch (Throwable throwable) {
            //如果出现了异常,调用异常处理方法将错误信息封装到Result中并返回
            result = handlerException(throwable);
        }
        return result;
    }

    //异常处理
    private Response handlerException(Throwable throwable) {
        Response result = null;
        //这里需要注意,返回枚举类中的枚举在写的时候应该和异常的名称相对应,以便动态的获取异常代码和异常信息,我这边是统一返回500,msg存报的异常
        //获取异常名称的方法
        String errorName = throwable.toString();
        errorName = errorName.substring(errorName.lastIndexOf(".") + 1);
        result = Response.error(errorName);
        return result;
    }

}

postman 测试:

 GitHub地址:GitHub - zhouzhiwengang/SpringBoot-Project

        中的SmartUrban项目。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/944613.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号