1.当发生异常时,如果每个controller都手工处理,返回JSON ,这样太麻烦了。
2.首先,创建一个统一的异常结果类:
public class ErrorResult {
private String errNo;
private String errMsg;
private String status;
//getter和setter略
}
3.编写一个自定义异常类
public class MyException extends Exception {
private String errNo;
public MyException(String msg) {
super(msg);
}
public MyException(String msg ,String errNo) {
super(msg);
this.errNo = errNo;
}
public String getErrNo() {
return errNo;
}
public void setErrNo(String errNo) {
this.errNo = errNo;
}
}
4.使用一下两个注解,创建一个异常处理器
@RestControllerAdvice(则会自动注册为全局异常处理器)
并配合@ExceptionHandler(自定义的错误处理器)
@RestControllerAdvice
public class MyHandler {
@ExceptionHandler(value = Exception.class)//默认异常处理
public ErrorResult defaulHandler(Exception ex,HttpServletResponse response){
ErrorResult errorResult = new ErrorResult("null",ex.getMessage(),response.getStatus());
return errorResult;
}
@ExceptionHandler(value=MyException.class)//自定义异常的处理器
public ErrorResult myHandler(MyException ex,HttpServletResponse response){
ErrorResult errorResult = new ErrorResult(ex.getErrNo(),ex.getMessage(),response.getStatus());
return errorResult;
}
这时,controller出现异常时,全局处理器自动会返回异常信息;
5.当地址输入错误,报404错误时,还是不能处理,
6.这时,可以这样处理:
新增一个RestController去继承SpringBoot里面的ErrorController接口,代码如下:
@RestController
public class MyErrController implements ErrorController {
@RequestMapping(value="/error")
public ErrorResult myError(HttpServletResponse rs,Exception ex){
ErrorResult er = new ErrorResult("10000",ex.getMessage(),rs.getStatus());
return er;
}
@Override
public String getErrorPath() {
return "/error";
}
7.异常测试:
@RestController
public class TestController {
@RequestMapping(value = "/test",method = RequestMethod.GET)
public String test() throws Exception {
throw new Exception("我是测试的");
}
@RequestMapping(value = "/test2",method = RequestMethod.GET)
public String test2() throws Exception {
throw new MyException("自定义异常","10000");
}
}