SpringBoot 全局异常处理

YangYongKang 发布于 2018-08-24 21:22:57

说明

spring boot全局异常是以ControllerAdvice注解和@ExceptionHandler注解实现对全局异常的特殊处理,当然你也可以使用 @Controller + @ExceptionHandler进行局部异常处理.

局部异常处理

  • 局部异常处理 @Controller + @ExceptionHandler

    局部异常主要用到的是@ExceptionHandler注解,此注解注解到类的方法上,当此注解里定义的异常抛出时,此方法会被执行。如果@ExceptionHandler所在的类是@Controller,则此方法只作用在此类,示例代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
      /**
       * author: yangyongkang
       * date:2018/8/22
       * time:13:58
       * description:添加企业文化
       **/
      //局部异常处理
      @ExceptionHandler(Exception.class)
      @PostMapping("/addCultureInfo")
      public ResponseEntity addCultureInfo(CultureModel cultureModel,HttpServletRequest request) {
          cultureService.addCultureInfo(cultureModel,request);
          return ResponseEntity.build(200, "企业文化添加成功!", cultureModel);
      }
    

    全局异常处理

  • 全局异常处理 @ControllerAdvice + @ExceptionHandler

在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中。 简单的说,进入Controller层的错误才会由@RestControllerAdvice,拦截器抛出的错误以及访问错误地址的情况@ControllerAdvice处理不了,由SpringBoot默认的异常处理机制处理,示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@RestControllerAdvice
public class GlobalExceptionHandler {

	@ExceptionHandler(value = Exception.class)
	public ResponseEntity exceptionHandler(Exception e) {
		return ResponseEntity.build(Constant.ERROR_CODE, e.getMessage(), null);
	}

	@ExceptionHandler(value = ResourceNotFoundException.class)
	public ResponseEntity resourceNotFoundExceptionHandler(ResourceNotFoundException e) {
		return ResponseEntity.build(Constant.ERROR_CODE, e.getMessage(), null);
	}

	/**
	 * 自定义验证异常(参数传值)
	 */
	@ExceptionHandler(value = ConstraintViolationException.class)
	public ResponseEntity validatedBindException(ConstraintViolationException e) {
		return ResponseEntity.build(Constant.ERROR_CODE, e.getMessage(), null);
	}
}