在web应用中,请求处理过程中发生异常是非常常见的情况。springboot为我们提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局的错误页面用来展示异常内容。为了测试,我们通过IDEA的Spring Initializr来快速创建一个SpringBoot的web项目,创建过程省略。
创建完成之后,启动这个项目,访问一个不存在的URL,页面会显示一下内容
该页面就是Spring Boot提供的默认error映射页面。
1、统一异常处理
虽然,Spring Boot中实现了默认的error映射,但是在实际应用中,我们通常需要去实现我们自己的异常提示。例如,当我们要实现RESTful API时,返回的错误是JSON格式的数据。我们一起来实现一下。
新建CodeMsg类
public class CodeMsg { private int code;//错误码 private String msg;//错误信息 private CodeMsg(int code, String msg) { this.code = code; this.msg = msg; } /** 系统模块 */ public static CodeMsg SERVER_ERROR = new CodeMsg(500100,"服务端异常"); public static CodeMsg NULL_POINT_EXCEPTION = new CodeMsg(500200,"空指针异常"); public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } }
新建Result类
Result类是用来统一管理返回数据的类
public class Result<T> { private int code;//错误码 private String msg;//提示信息 private T data;//返回的数据 private Result(T data){ this.code = 200; this.msg = "success"; this.data = data; } private Result(CodeMsg codeMsg){ if (codeMsg == null){ return; } this.code = codeMsg.getCode(); this.msg = codeMsg.getMsg(); } /** * 成功的时候调用,接口返回数据 */ public static <T> Result<T> success(T data){ return new Result<T>(data); } /** * 失败的时候调用,返回错误信息 */ public static <T> Result<T> error(CodeMsg codeMsg){ return new Result<T>(codeMsg); } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public T getData() { return data; } public void setData(T data) { this.data = data; } }
新建ZhuangException类
public class ZhuangException extends RuntimeException{ private CodeMsg codeMsg; public ZhuangException(CodeMsg codeMsg){ super(codeMsg.toString()); this.codeMsg = codeMsg; } public CodeMsg getCodeMsg() { return codeMsg; } }
新建GlobalExceptionHandler类
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(value = ZhuangException.class) @ResponseBody public Result<Object> exceptionHandler(HttpServletRequest request, ZhuangException ex){ return Result.error(ex.getCodeMsg()); } }
新建UserController测试
@Controller public class UserController { @RequestMapping("/test") @ResponseBody public Result<List<String>> test(){ try { //测试空指针异常 String a = null; a.length(); List<String> list = new ArrayList<String>(); list.add("测试数据"); return Result.success(list); }catch (Exception e){ throw new ZhuangException(CodeMsg.NULL_POINT_EXCEPTION); } } }
启动工程,访问http://localhost:8080/test,页面上显示的信息为
{"code":500200,"msg":"空指针异常","data":null}
这样的提示信息简洁明了,看着舒服。
至此,已完成在Spring Boot中创建统一的异常处理,实际实现还是依靠Spring MVC的注解,更多更深入的使用可参考Spring MVC的文档。
参考:http://blog.didispace.com/springbootexception/