在开发中,咱们常常会应用 try/catch 块
来捕捉异样进行解决,如果有些代码中遗记捕捉异样或者不可见的一些异样呈现,就会响应给前端一些不敌对的提醒,这时候咱们能够应用全局异样解决。这样就不必在代码中写那些烦人的try/catch 块了
,代码的可读性也会进步。
SpringBoot 提供的的注解 @ControllerAdvice
示意开启全局异样捕捉,在自定义的异样办法上应用 ExceptionHandler
来进行对立解决。
上面一起看看如何优雅的解决全局异样!
一 定义响应状态码及信息的枚举类
@Getter
public enum CodeEnum {SUCCESS(0,"申请胜利"),
ERROR(500,"未知异样"),
ERROR_EMPTY_RESULT(1001,"查问后果为空"),
ERROR_INCOMPLETE_RESULT(1002,"申请参数不全");
private int code;
private String message;
CodeEnum(int code,String message){
this.code = code;
this.message = message;
}
}
二 定义响应数据的实体类
@Slf4j
@Data
public class R<T> implements Serializable {
private static final long serialVersionUID = 572235155491705152L;
/**
* 响应的状态码
*/
private int code;
/***
* 响应的信息
*/
private String message;
/**
* 响应数据
*/
private T data;
/**
* 放入响应码并返回
* @param code
* @param msg
* @return
*/
public R fillCode(int code,String msg){
this.code = code;
this.message = msg;
return this;
}
/**
* 放入响应码并返回
* @param codeEnum
* @return
*/
public R fillCode(CodeEnum codeEnum){this.code = codeEnum.getCode();
this.message = codeEnum.getMessage();
return this;
}
/**
* 放入数据并响应胜利状态
* @param data
* @return
*/
public R fillData(T data){this.code = CodeEnum.SUCCESS.getCode();
this.message = CodeEnum.SUCCESS.getMessage();
this.data = data;
return this;
}
}
三 自定义两个异样
依据业务需要自定义异样,在本文中我定义了两个异样,别离用作响应后果为空时解决和申请参数谬误时解决。
@Data
public class EmptyResutlException extends RuntimeException {
private static final long serialVersionUID = -8839210969758687047L;
private int code;
private String message;
public EmptyResutlException(CodeEnum codeEnum){this.code = codeEnum.getCode();
this.message = codeEnum.getMessage();}
}
@Data
public class RequestParamException extends RuntimeException {
private static final long serialVersionUID = 4748844811214637041L;
private int code;
private String message;
public RequestParamException(CodeEnum codeEnum){this.code = codeEnum.getCode();
this.message = codeEnum.getMessage();}
}
四 定义全局异样解决类
因为这里我想要响应的后果为实体类对象,因而我间接用 @RestControllerAdvice
来代替了 @ControllerAdvice
,这两个注解的差异跟@Controller
和@RestController
一样,rest 的响应体为 json 格局的数据。
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
/**
* 查问后果为空时解决
* @param e
* @return
*/
@ExceptionHandler(EmptyResutlException.class)
public R emptyResultExceptionHandler(EmptyResutlException e){log.error("查问后果为空:{}",e.getMessage());
R result = new R();
result.fillCode(e.getCode(),e.getMessage());
return result;
}
/**
* 申请参数谬误时解决
* @param e
* @return
*/
@ExceptionHandler(RequestParamException.class)
public R requestParamExceptionHandler(RequestParamException e){log.error("申请参数不非法:{}",e.getMessage());
R result = new R();
result.fillCode(e.getCode(),e.getMessage());
return result;
}
/**
* 解决其余异样
* @param e
* @return
*/
@ExceptionHandler(Exception.class)
public R exceptionHandler(Exception e){log.error("未知异样:{}",e.getMessage());
R result = new R();
result.fillCode(CodeEnum.ERROR);
return result;
}
}
五 自定义接口测试异样
@RestController
public class TestController {@GetMapping("getString")
public R getString(String name){if(StringUtils.isEmpty(name)){throw new RequestParamException(1002,"申请参数 name 为空");
}else if ("Java 旅途".equals(name)) {
// 这里没有查问操作,当申请参数是 Java 旅途的时候,模仿成查问后果为空
throw new EmptyResutlException(1001,"查问后果为空");
}
// 这里模仿一下除自定义异样外的其余两种异样
int i = 0;
i = 5/i;
return new R().fillData(name);
}
}
在理论开发中能够自定义响应状态码的枚举类和自定义异样以满足需要。
此是 spring-boot-route 系列的第四篇文章,这个系列的文章都比较简单,次要目标就是为了帮忙首次接触 Spring Boot 的同学有一个零碎的意识。本文已收录至我的 github,欢送各位小伙伴star
!
github:https://github.com/binzh303/s…
点关注、不迷路
如果感觉文章不错,欢送 关注 、 点赞 、 珍藏,你们的反对是我创作的能源,感激大家。
如果文章写的有问题,请不要悭吝,欢送留言指出,我会及时核查批改。
如果你还想更加深刻的理解我,能够微信搜寻「Java 旅途」进行关注。回复「1024」即可取得学习视频及精美电子书。每天 7:30 准时推送技术文章,让你的下班路不在孤单,而且每月还有送书流动,助你晋升硬实力!