springboot404_Springboot项⽬统⼀异常处理
Springboot项⽬统⼀异常处理
⼀.接⼝返回值封装
基于⽬前⼤多数项⽬都采⽤前后端分离架构,所以后端接⼝统⼀返回值封装是⽐较重要的,便于前后端对接与统⼀处理。当然按各⾃项⽬约定实现即可,思路⼤同⼩异,下⾯是我的实现⽅式,仅供参考
1. 定义Result对象,作为通⽤返回结果封装
/**
*
@filename Result
*
*
@description 通⽤返回结果封装
*
* @author llspace
* @version 1.0
* @since 2019/6/17 11:55
**/
@Data
public class Result {
private int code;
private String msg;
private T data;
/**
* 成功时候的调⽤
*/
public static Result success(T data) {
return new Result(data);
}
/**
* 失败时候的调⽤
*/
public static Result error(CodeMsg cm) {
return new Result(cm);
}
private Result(T data) {
this.msg = "success";
this.data = data;
}
private Result(CodeMsg cm) {
if (cm == null) {
return;
}
this.msg = cm.getMsg();
}
}
2. 定义CodeMsg对象,作为通⽤状态码和消息封装
/** *
@filename CodeMsg
*
*
@description 通⽤状态码和消息封装
* * @author llspace * @version 1.0 * @since 2019/6/17 11:57 **/@Datapublic class CodeMsg { //⾃定义状态码 private int code; //消息信息private String msg; //通⽤异常 4001XX public static CodeMsg SUCCESS = new CodeMsg(0, "success"); public static CodeMsg SERVER_ERROR = new CodeMsg(500100, "服务端异常"); //模块1 4002XX //模块2 4003XX //模块3 4004XX private CodeMsg(
int code, String msg) { de = code; this.msg = msg; } public CodeMsg args) { int code = de; String message = String.format(this.msg, args); return new CodeMsg(code, message); }}
⼆.定义全局异常类
基于上⾯封装的CodeMsg实现GlobalException定义,异常继承RuntimeException
/**
*
@filename GlobalException
*
*
@description 全局异常信息
*
* @author llspace
* @version 1.0
* @since 2019/6/20 18:05
**/
404页面网站源码@Data
public class GlobalException extends RuntimeException {
private static final long serialVersionUID = 1L;
private CodeMsg codeMsg;
public GlobalException(CodeMsg codeMsg) {
String());
}
}
三.定义异常处理类
@RestControllerAdvice作⽤等同于@ResponseBody加上@ControllerAdvice,会在所有带有@Controller或者@RestController注解的类上⽣效,还可以使⽤basePackages参数配置指定异常处理类⽣效的包
/** *
@filename GlobalExceptionHandler
*
*
@description 全局异常处理类
* * @author llspace * @version 1.0 * @since 2019/6/20 18:07 **/@RestControllerAdvicepublic class
GlobalExceptionHandler {
@ExceptionHandler(value = Exception.class) public Result exceptionHandler(HttpServletRequest request, Exception e){
e.printStackTrace(); if(e instanceof GlobalException) { GlobalException exception = (GlobalException) e; return
<(CodeMsg()); }else if(e instanceof BindException) { BindException ex = (BindException) e; List errors =
<(CodeMsg.BIND_ERROR.fillArgs(msg)); }else { (CodeMsg.SERVER_ERROR); } }}
四.特殊处理404异常
spring boot默认不会抛出404异常(NoHandlerFoundException),所以在ControllerAdvice中捕获不到该异常,导致404总是跳过ContollerAdvice,直接显⽰ErrorController的错误页。需要改变配置,让404错误抛出异常(NoHandlerFoundException),这样便可在ControllerAdvice中捕获此异常。
如果是restful项⽬改变配置即可实现捕获上述异常,在l中添加:
spring: mvc: throw-exception-if-no-handler-found: true resources: add-mappings: false
注意:添加了如上配置会造成项⽬静态资源访问异常, 如果不是restful的项⽬这样配置就会有问题,所以就需要采⽤其他⽅式来处理了, 可以参考如下处理⽅法
如果是带静态资源的项⽬我们要如何来处理404异常呢?
断点下BasicErrorController类,查看下源码可知,errorHtml()⽅法默认会返回⼀个new ModelAndView(“error”, model),所以其实在classpath:/templates下⾃定义⼀个error.html即可,这样springboot默认的404错误就跳转到了⾃⼰项⽬下的error页⾯了,这种处理⽐较简单,如果想更好的封装错误页⾯,建议⾃⼰实现ErrorController接⼝,或者继承AbstractErrorController /
BasicErrorController类来实现,当然前提是删除掉配置⽂件中上述的两个配置。
五 . 测试使⽤效果
⾄此,统⼀异常处理就实现了,如下使⽤,
if(loginVO == null) { throw new GlobalException(CodeMsg.SERVER_ERROR);}
这样会抛出异常如下:
GlobalException(codeMsg=CodeMsg(code=500100, msg=服务端异常))如果是404异常会跳项⽬⾃定义的error页⾯
个⼈实现,仅供参考,有兴趣的⼩伙伴⾃⼰动⼿尝试吧!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论