在进行配置统一异常处理时,遇到了很奇怪的现象,根据网上的教程配置,始终没实现想要的效果
package com.app.base;
import java.lang.reflect.Method;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import com.common.ResultMessage;
@RestControllerAdvice
public class GlobalExceptionHandler {
Logger log = LoggerFactory.getLogger(getClass());
/**
* 全局异常拦截,封装报错信息
*/
@ExceptionHandler(Exception.class)
public Object runtimeExceptionHandler(Exception exception) {
// 打印 报错堆栈轨迹
log.error("出错了", exception);
ResultMessage<String> result = new ResultMessage<>();
result.setMessage("出错了");
result.setData(exception.getMessage());
result.setSuccess(false);
return result;
}
}
在启动日志中发现如下
Detected @ExceptionHandler methods in baseExceptionHandler
Detected @ExceptionHandler methods in globalExceptionHandler
baseExceptionHandler没见过, 在项目里搜索了下
原来项目中已经配置了一个全局异常处理类:
BaseExceptionHandler 该类使用了注解@ControllerAdvice
我本次新增的类:
GlobalExceptionHandler 使用了注解@RestControllerAdvice
原因:
两个类中都实现了拦截 Exception异常,并处理
第一个加载的baseExceptionHandler覆盖了后加载的globalExceptionHandler, 导致了失效
方式一:
注释掉BaseExceptionHandler类中,对Exception中的处理代码
最终成功调用GlobalExceptionHandler 类中的代码
================================================================
@ControllerAdvice与@RestControllerAdvice的区别?
@ControllerAdvice 标记的方法期望返回json数据时,需要添加@ResponseBody注解
@RestControllerAdvice 则不需要添加@ResponseBody注解
================================================================
假设一部分接口是老接口, 一部分是新接口, 对异常处理的逻辑完全不一样,
能不能, 有两套异常处理逻辑呢?
方式二:
书写一个控制器类的父类
public abstract class BaseController {
Logger log = LoggerFactory.getLogger(getClass());
/**
* 全局异常拦截,封装报错信息
*
* @param exception
* @return
*/
@ExceptionHandler(Exception.class)
public Object runtimeExceptionHandler(Exception exception) {
// 打印 报错堆栈轨迹
exception.printStackTrace();
ResultMessage<String> result = new ResultMessage<>();
result.setMessage("出错了");
result.setData(exception.getMessage());
result.setSuccess(false);
return result;
}
}
可以参考异常处理@ExceptionHandler遇到的问题_failure in @exceptionhandler_琅琊山二当家的博客-优快云博客
这样一来,就可用使用2种不同的形式
默认的是GlobalExceptionHandler来处理,凡是要进行自定义处理的,可以继承BaseController
==============