spring-boot统一异常处理
统一异常处理
在程序中我们可以使用throw new Exception("发生错误)
来直接抛出异常,如:
@RequestMapping("/hello")
public String hello() throws Exception {
throw new Exception("发生错误");
}
此时,看到的报错页面显示404 Not Found,原因是:当处理抛出异常时,spring-boot提供了一个默认的映射:/error
那么如何实现我们自己的抛出的异常提示呢?
创建全局异常处理类:通过使用@ControllerAdvice定义统一的异常处理类。@ExceptionHandler用来定义函数针对的异常类型进行处理
在这里需要用到3个注解
- @RestControllerAdvice 将类定义为统一的异常处理类
- @ExceptionHandler 用来定义针对的异常类型处理的函数
- @ResponseBody 设置返回数据为json
看看下面的实现
自定义一个我们自己的异常类型,可以在程序中抛出这个异常
public class MyException extends RuntimeException{
public MyException(String message){
super(message);
}
}
在Controller中抛出我们自己定义的
MyException
异常@Controller
public class HelloController {@RequestMapping("/hello")
public String hello() throws MyException {
throw new MyException("发生错误2");
}
}
通过使用@ControllerAdvice定义统一的异常处理类,使用@ExceptionHandler来定义函数针对的异常类型来匹配错误映射和处理
@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(value = Exception.class) //用来定义函数针对的异常类型为Exception类型
@ResponseBody
public ErrorReturn<Object> handlerException(Exception e)throws Exception{
ErrorReturn<Object> r = new ErrorReturn<>();
r.setCode("500");
r.setData( "service error" );
r.setMessage(e.getMessage());
return r;
}
@ExceptionHandler(value=MyException.class) //用来定义函数针对的异常类型为MyException类型
@ResponseBody
public ErrorReturn<Object> jsonErrorHandler(HttpServletRequest req, MyException e) throws Exception{
ErrorReturn<Object> r = new ErrorReturn<>();
r.setCode("502");
r.setMessage(e.getMessage());
r.setData("service error");
return r;
}
}
这样到我们抛出
MyException
异常时,就会调用jsonErrorHandler
来处理,因为使用了@ResponseBody
修饰,所以返回的结果会是json,返回的处理类型是ErrorReturn,我们定义一下public class ErrorReturn
{ private String code;
private String message;
private T data;
//省略getter和setter
}
最后我们访问
/hello
时会抛出MyException
异常,这个异常被@RestControllerAdvice
修饰的对象GlobalExceptionHandler
所处理,在@ExceptionHandler(value=MyException.class)
修饰中分配给jsonErrorHandler
方法处理,处理结果是返回一个ErrorReturn
对象的json,如下{
code: "502",
message: "发生错误",
data: "service error"
}
转载于//my.oschina.net/tongjh/blog/1596719
还没有评论,来说两句吧...