springboot全局异常处理
前言
一个项目总会出现错误,而我们需要将其中的某些错误用自己的方式去处理 ,这时候就会用到springmvc的全局异常处理了;当然,还有其他的方式去处理这些异常,这里就不讨论了;
springboot有一个默认的异常处理,但是自己感觉还没有达到自己的预想,需要自己对异常进行简单的处理,于是就有了这篇文章。
注意,我是使用idea直接构建的springboot项目;
正文
注解说明
以下是全局异常处理主要用到的两个注解:
@ControllerAdvice
- 该注解主要用于类上
- 该注解的主要参数
basePackages
:处理某一个包下面的异常
@ExceptionHandler
- 用于方法上
- 里面只有一个
value
参数,这个参数就是需要处理的异常的ExceptionName.class
,那么这个方法就会只处理这个错误,其他的错误就不会处理;
用到的代码
在项目中新建两个类
- controller类
@RestController
@RequestMapping("/test")
public class TestController {
@GetMapping("/one")
public String testOne(@RequestParam(name = "test")String test){
return "success";
}
}
- 异常处理类
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ExceptionName.class)
public void test(参数1,参数2.....){
//自己的处理方式
}
}
方法上还可以用其它允许的注解,视个人而定,参数也是可以自己添加,但是需要添加的参数必须是要被允许的;
测试
启动项目进行以下测试,这里自己小小的实验了一把,自己定义一个请求,里面会需要一个test
参数,而且还是get
请求,接下来看用各种请求会出现深结果,然后自己处理后的结果;
get
请求不带test
参数,我用的postman来发送的请求,且异常处理类中不写处理
在postman端请求出现的结果:
{
"timestamp": "2018-08-07T02:32:25.262+0000",
"status": 400,
"error": "Bad Request",
"message": "Required String parameter 'test' is not present",
"path": "/test/one"
}
但是为了更直接一点,我们对这个错误进一步进行了处理;
在异常处理类中添加以下代码:
@ExceptionHandler(MissingServletRequestParameterException.class)
@ResponseBody
public String test(MissingServletRequestParameterException e, HttpServletRequest request){
System.out.println(e.toString());
System.out.println("请求地址:"+request.getRequestURL());
return "请求地址:"+request.getRequestURL()+"缺少请求参数";
}
这里处理的错误为MissingServletRequestParameterException
,也就是除此之外的错误都不会处理
请求结果:
请求地址:http://localhost:8080/test/one缺少请求参数
-
post请求,带test参数,异常处理类中不处理;
不处理出现的结果:
{
"timestamp": "2018-08-07T03:12:00.503+0000",
"status": 405,
"error": "Method Not Allowed",
"message": "Request method 'POST' not supported",
"path": "/test/one"
}
在异常类中添加以下代码:
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
@ResponseBody
public String testTwo(HttpRequestMethodNotSupportedException e, HttpServletRequest request){
System.out.println(e.toString());
System.out.println("请求地址:"+request.getRequestURL());
return "请求地址:"+request.getRequestURL()+"请求方式错误";
}
添加代码后的请求结果:
请求地址:http://localhost:8080/test/one请求方式错误
最后
其实以上的测试只是一个实验,也许在现实开发中出现以上的错误一眼就能看出哪里错了;但是为了更明显的说明错误,就自己进行了处理;
总结
十分感谢你能看完这篇文章!