SpringBoot 统一异常处理 @ControllerAdvice 失效

在进行配置统一异常处理时,遇到了很奇怪的现象,根据网上的教程配置,始终没实现想要的效果

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_琅琊山二当家的博客-CSDN博客
这样一来,就可用使用2种不同的形式

默认的是GlobalExceptionHandler来处理,凡是要进行自定义处理的,可以继承BaseController

==============

https://www.cnblogs.com/lvbinbin2yujie/p/10574812.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值