@ControllerAdvice

​ @ControllerAdvice注解是Spring3.2中新增的注解,只能用于类上,与下面三个方法注解结合可进行一些全局操作。

方法注解

@InitBinder

用于request中自定义参数解析方式进行注册,从而达到自定义指定格式参数的目的。

1
2
3
4
5
6
7
8
9
10
11
12
13
@ControllerAdvice
@ResponseBody
@Slf4j
public class GlobalExceptionHandler {
/**
* 注册Date类型参数转换器的实现
* @param binder
*/
@InitBinder
public void globalInitBinder(WebDataBinder binder) {
binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));
}
}

@ModelAttribute

表示其注解的方法将会在目标Controller方法执行之前执行。

1
2
3
4
5
6
7
8
9
10
@ControllerAdvice
@ResponseBody
@Slf4j
public class GlobalExceptionHandler {
@ModelAttribute(value = "key")
public String globalModelAttribute() {
System.out.println("添加了全局属性。");
return "key_value";
}
}
1
2
3
4
5
@GetMapping("/list")
public List<String> list(@ModelAttribute("key") String key) {
log.info("key: {}", key);
return null;
}

控制台打印:

​ 添加了全局属性。

​ key: key_value

@ExceptionHandler

用于捕获Controller中抛出的指定类型的异常

​ 返回自定义实体 统一格式,特别是前后端分离自定义消息格式(记得加@ResponseBody)。

​ 返回 ModelAndView 跳转到指定页面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package com.czm.handler;

import com.czm.constants.ResultCodeEnum;
import com.czm.dto.ResultDto;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.NoHandlerFoundException;

/**
* @Author CZM
* @create 2020/10/27
*/
@ControllerAdvice
@ResponseBody //返回ResultDto消息实体的json对象
@Slf4j
public class GlobalExceptionHandler {

@ExceptionHandler(Exception.class)
public ResultDto<String> exceptionHandler(Exception exception) {
log.error("未知错误:{},{}",exception.getClass().getName() ,exception.getMessage());
return ResultDto.buildErrorMeesage(ResultCodeEnum.ERROR.getCode(),
ResultCodeEnum.ERROR.getMessage());
}

@ExceptionHandler(MissingServletRequestParameterException.class)
public ResultDto<String> ParameterExceptionHandler(
MissingServletRequestParameterException exception) {
log.error("错误请求:{},{}",exception.getClass().getName() ,exception.getMessage());
return ResultDto.buildErrorMeesage(ResultCodeEnum.BAG_REQUEST.getCode(),
ResultCodeEnum.BAG_REQUEST.getMessage());
}

@ExceptionHandler(NoHandlerFoundException.class)
public ResultDto<String> NotFountHandler(NoHandlerFoundException exception) {
log.error("404错误:{},{}",exception.getClass().getName(), exception.getMessage());
return ResultDto.buildErrorMeesage(ResultCodeEnum.NOT_FOUND.getCode(),
ResultCodeEnum.NOT_FOUND.getMessage());
}

}

注:要想拦截404,400等错误请求,需要在springboot配置文件上加上一下配置,否则拦截不到

1
2
3
4
5
6
7
spring:
#出现错误时, 直接抛出异常
mvc:
throw-exception-if-no-handler-found: true
#不要为我们工程中的资源文件建立映射
resources:
add-mappings: false

END