springboot全局异常处理

avatar

前言

​ 一个项目总会出现错误,而我们需要将其中的某些错误用自己的方式去处理 ,这时候就会用到springmvc的全局异常处理了;当然,还有其他的方式去处理这些异常,这里就不讨论了;

​ springboot有一个默认的异常处理,但是自己感觉还没有达到自己的预想,需要自己对异常进行简单的处理,于是就有了这篇文章。

​ 注意,我是使用idea直接构建的springboot项目;

正文

注解说明

以下是全局异常处理主要用到的两个注解:

@ControllerAdvice

  1. 该注解主要用于类上
  2. 该注解的主要参数basePackages:处理某一个包下面的异常

@ExceptionHandler

  1. 用于方法上
  2. 里面只有一个value参数,这个参数就是需要处理的异常的ExceptionName.class,那么这个方法就会只处理这个错误,其他的错误就不会处理;

用到的代码

​ 在项目中新建两个类

  • controller类
1
2
3
4
5
6
7
8
9
10
11

@RestController
@RequestMapping("/test")
public class TestController {

    @GetMapping("/one")
    public String testOne(@RequestParam(name = "test")String test){
        return "success";
    }
}

  • 异常处理类
1
2
3
4
5
6
7
8
9
10

@ControllerAdvice
public class GlobalExceptionHandler {
    
    @ExceptionHandler(ExceptionName.class)
    public void test(参数1,参数2.....){
        //自己的处理方式
    }
}

方法上还可以用其它允许的注解,视个人而定,参数也是可以自己添加,但是需要添加的参数必须是要被允许的;

测试

​ 启动项目进行以下测试,这里自己小小的实验了一把,自己定义一个请求,里面会需要一个test参数,而且还是get请求,接下来看用各种请求会出现深结果,然后自己处理后的结果;

  1. get请求不带test参数,我用的postman来发送的请求,且异常处理类中不写处理

在postman端请求出现的结果:

1
2
3
4
5
6
7
8
9

{
    "timestamp": "2018-08-07T02:32:25.262+0000",
    "status": 400,
    "error": "Bad Request",
    "message": "Required String parameter 'test' is not present",
    "path": "/test/one"
}

​ 但是为了更直接一点,我们对这个错误进一步进行了处理;

​ 在异常处理类中添加以下代码:

1
2
3
4
5
6
7
8
9

  @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,也就是除此之外的错误都不会处理

​ 请求结果:

1
2
3

请求地址:http://localhost:8080/test/one缺少请求参数

  1. post请求,带test参数,异常处理类中不处理;

    不处理出现的结果:

1
2
3
4
5
6
7
8
9

{
    "timestamp": "2018-08-07T03:12:00.503+0000",
    "status": 405,
    "error": "Method Not Allowed",
    "message": "Request method 'POST' not supported",
    "path": "/test/one"
}

​ 在异常类中添加以下代码:

1
2
3
4
5
6
7
8
9

@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
    @ResponseBody
    public String testTwo(HttpRequestMethodNotSupportedException e, HttpServletRequest request){
        System.out.println(e.toString());
        System.out.println("请求地址:"+request.getRequestURL());
        return "请求地址:"+request.getRequestURL()+"请求方式错误";
    }
    

添加代码后的请求结果:

1
2
3

请求地址:http://localhost:8080/test/one请求方式错误

最后

​ 其实以上的测试只是一个实验,也许在现实开发中出现以上的错误一眼就能看出哪里错了;但是为了更明显的说明错误,就自己进行了处理;

总结

十分感谢你能看完这篇文章!

参考链接1

坚持原创技术分享,您的支持将鼓励我继续创作!