利用注解@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 全局异常内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论