Controller异常统一处理

使用

@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) {
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值