当前位置: 代码网 > it编程>编程语言>Java > SpringBoot中@RestControllerAdvice 全局异常处理的实现

SpringBoot中@RestControllerAdvice 全局异常处理的实现

2025年06月18日 Java 我要评论
利用注解@restcontrolleradvice 轻轻松松实现全局异常处理一、定义统一响应体package com.zhh.demo.common.response;import io.swagge

利用注解@restcontrolleradvice 轻轻松松实现全局异常处理

一、定义统一响应体

package com.zhh.demo.common.response;

import io.swagger.annotations.apimodel;
import io.swagger.annotations.apimodelproperty;
import lombok.data;

import java.io.serializable;

/**
 * @description: 接口出参统一响应实体
 * @author: zhaoheng
 * @createtime: 2022-08-05  16:27
 */
@data
@apimodel("接口出参统一响应实体")
public class response<t> implements serializable {
    private static final long serialversionuid = 3692286106860121474l;

    @apimodelproperty(value = "状态码")
    private string code;

    @apimodelproperty(value = "说明")
    private string message;

    private t data;

    public response(){}

    public response(string code, string message) {
        this.code = code;
        this.message = message;
    }

    public response(string code, string message, t data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }
}
package com.zhh.demo.common.response;

import lombok.getter;

/**
 * @description: 统一响应code和说明
 * @author: zhaoheng
 * @createtime: 2022-08-05  16:42
 */
public enum responsecode {

    /** 通用码 **/
    fail("-1", "系统错误"),
    ok("200", "成功"),

    /**
     * 参考阿里巴巴开发手册
     * 错误码为字符串类型,共5位,分两部分组成:错误标识+4位数字编号。
     * 例:a0001,a1001,b0001,c0001... a、b、分别代表不通业务或者来源
     **/

    /** 参数校验不通过 **/
    parameter_check_fails("a0001","参数校验不通过"),

    /** 用户相关 a1xxx **/
    user_name_nonstandard("a1002", "用户名不合规");

    responsecode(string code, string msg) {
        this.code = code;
        this.msg = msg;
    }

    @getter
    private string code;

    @getter
    private string msg;
}
package com.zhh.demo.common.response;

import com.zhh.demo.entity.common.responsepage;

import java.util.list;

/**
 * @description: 接口统一响应实体构造类
 * @author: zhaoheng
 * @createtime: 2022-08-05  16:37
 */
public class responsefactory {

    /**
     * 默认成功
     * @param t
     * @param <t>
     * @return
     */
    public static <t> response<t> success(t t){
       return new response<t>(responsecode.ok.getcode(),responsecode.ok.getmsg(),t);
    }

    /**
     * 成功
     * @param responsecode  响应code和说明
     * @param t
     * @param <t>
     * @return
     */
    public static <t> response<t> success(responsecode responsecode, t t){
        return new response<t>(responsecode.getcode(),responsecode.getmsg(),t);
    }

    /**
     * 成功
     * @param responsecode  响应code和说明
     * @return
     */
    public static <t> response<t> success(responsecode responsecode){
        return new response<t>(responsecode.getcode(),responsecode.getmsg());
    }

    /**
     * 默认失败
     * @param <t>
     * @return
     */
    public static <t> response<t> error(){
        return new response<t>(responsecode.fail.getcode(),responsecode.fail.getmsg());
    }

    /**
     * 失败
     * @param responsecode  响应code和说明
     * @param t
     * @param <t>
     * @return
     */
    public static <t> response<t> error(responsecode responsecode, t t){
        return new response<t>(responsecode.getcode(),responsecode.getmsg(),t);
    }

    /**
     * 失败
     * @param responsecode  响应code和说明
     * @return
     */
    public static <t> response<t> error(responsecode responsecode){
        return new response<t>(responsecode.getcode(),responsecode.getmsg());
    }

    /**
     * 失败
     * @param code  错误码
     * @param msg   说明
     * @param t     响应数据
     * @param <t>
     * @return
     */
    public static <t> response<t> error(string code, string msg, t t){
        return new response<t>(code,msg,t);
    }

    /**
     * 失败
     * @param code  错误码
     * @param msg   说明
     * @return
     */
    public static <t> response<t> error(string code, string msg){
        return new response<t>(code,msg);
    }

    public static <t> responsepage pageresult(list<t> list, int total){
        return new responsepage<t>(list,total);
    }

}

二、定义全局异常处理类

package com.zhh.demo.common.exception;

import com.zhh.demo.common.response.response;
import com.zhh.demo.common.response.responsecode;
import com.zhh.demo.common.response.responsefactory;
import lombok.extern.slf4j.slf4j;
import org.springframework.validation.bindingresult;
import org.springframework.validation.fielderror;
import org.springframework.web.bind.methodargumentnotvalidexception;
import org.springframework.web.bind.annotation.exceptionhandler;
import org.springframework.web.bind.annotation.restcontrolleradvice;

import java.util.list;

/**
 * @description: 全局异常处理
 * @author: zhaoheng
 * @createtime: 2022-08-05  17:33
 */
@slf4j
@restcontrolleradvice
public class exceptionhandle {

    /**
     * 处理exception异常
     * @param exception 异常类型
     * @return
     */
    @exceptionhandler(value = exception.class)
    public response<?> exceptionhandle(exception exception){
        log.error("系统出现异常:",exception);
        return responsefactory.error(responsecode.fail);
    }

    /**
     * 处理业务异常
     * @param exception 异常类型
     * @return
     */
    @exceptionhandler(value = baseexception.class)
    public response<?> baseexceptionhandle(baseexceptionexception){
        log.error("系统业务异常:",exception);
        return responsefactory.error(exception.getcode(),exception.getmsg());
    }

    /**
     * 入参校验异常,校验不通过,抛出异常信息
     * @param exception valid 入参校验异常
     * @return
     */
    @exceptionhandler(value = methodargumentnotvalidexception.class)
    public response<?> methodargumentnotvalidexceptionhandle(methodargumentnotvalidexception exception){
        log.error("入参校验不通过",exception);
        bindingresult bindingresult = exception.getbindingresult();
        list<fielderror> fielderrorlist = bindingresult.getfielderrors();
        fielderrorlist.foreach(fielderror -> {
            log.info("字段:{},message:{}",fielderror.getfield(),fielderror.getdefaultmessage());
        });
        // 一个一个给调用方返回提示
        string message = fielderrorlist.get(0).getdefaultmessage();
        return responsefactory.error(responsecode.parameter_check_fails.getcode(), message);
    }

}

自定义异常

package com.zhh.demo.common.exception;

import com.zhh.demo.common.response.response;
import com.zhh.demo.common.response.responsecode;
import lombok.data;

/**
 * @description: 异常基类
 * @author: zhaoheng
 * @createtime: 2022-08-05  17:22
 */
@data
public abstract class baseexception extends runtimeexception{

    /**
     * code码
     */
    private string code;

    /**
     * 异常说明
     */
    private string msg;

    /**
     * 响应体
     */
    private response response;

    public baseexception(string code, string msg) {
        super(msg);
        this.code = code;
        this.msg = msg;
        this.response = new response(code,msg);
    }

    public baseexception(responsecode responsecode) {
        super(responsecode.getmsg());
        this.code = responsecode.getcode();
        this.msg = responsecode.getmsg();
        this.response = new response(responsecode.getcode(),responsecode.getmsg());
    }
}

三、编写接口测试效果

package com.zhh.demo.controller;

import io.swagger.annotations.api;
import io.swagger.annotations.apioperation;
import org.springframework.validation.annotation.validated;
import org.springframework.web.bind.annotation.postmapping;
import org.springframework.web.bind.annotation.requestmapping;
import org.springframework.web.bind.annotation.restcontroller;

import java.util.arraylist;


@api(tags = "test-api")
@requestmapping("/api/test")
@restcontroller
@validated // 开启入参校验
public class testcontroller {
    
    @apioperation("异常测试")
    @postmapping("/t1")
    public string test(){
        // 模拟异常
        new arraylist<>().get(1);
        return "";
    }
}

经过测试,接口抛出异常后会被异常处理类处理,并且给调用端返回指定格式的提示信息

{
  "code": "-1",
  "message": "系统错误",
  "data": null
}

到此这篇关于springboot中@restcontrolleradvice 全局异常处理的实现的文章就介绍到这了,更多相关springboot @restcontrolleradvice 全局异常内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网! 

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com