使用
@ControllerAdvice注解在指定控制器上,@ExceptionHandler可以指定异常的细分类型
@ControllerAdvice
public class BaseController {
private static final Logger logger = LoggerFactory.getLogger(BaseController.class);
/**
* 参数类型转换错误
*
* @param exception 错误
* @return 错误信息
*/
@ExceptionHandler(HttpMessageConversionException.class)
public String parameterTypeException(HttpMessageConversionException exception){
logger.error(exception.getCause().getLocalizedMessage());
return ResultErr("类型转换错误");
}
/**
* 统一异常处理
*/
@ExceptionHandler(value = Exception.class)
@ResponseBody
public String handlerException(Exception e) {
logger.error("Data check failure : errorMessage{"+e.getMessage()+"}");
return ResultErr(e.getCode(), e.getMessage());
}
}
反例:异常场景
正在写代码写着正爽,忽然有人过来告诉我,XX环境的你的那个类报错,吓我一条,仔细看后才发现问题出哪里,以下是场景。
一个 get类型的/b的请求访问到服务器,在B类中发生了异常(@PostMapping限定了访问类型),触发异常后在本类中没有对应的异常处理方法;
因为 @ControllerAdvice默认覆盖的是全局的controller,
所以找到了A类中的method,打印了异常。
这次异常是因为我错误的使用了@ControllerAdvice,导致私有化的异常处理变成了全局的异常处理,反例啊!
A类
@Slf4j
@ControllerAdvice
@RestController
public class A{
@RequestMapping("/a")
@ResponseBody
public String customException(Exception e) {
return e.getMessage();
}
@ExceptionHandler(Exception.class)
@ResponseBody
public String method(Exception e) {
log.error("A error : {}",e.getMessage());
Map<String>
return e.getMessage();
}
}
B类
@ControllerAdvice
@RestController
public class B{
@PostMapping("/b")
public void customException(Exception e) {
}
}