@ControllerAdvice + @ExceptionHandler 不起作用,springboot异常处理的一些坑

本文分享了在SpringBoot中使用@ControllerAdvice处理异常的实战经验,揭示了一个常见但容易忽视的坑:当使用@ExceptionHandler注解时,返回值类型最好为Map且不能包含null值。文章通过具体案例展示了如何避免这一陷阱,确保异常处理机制正常运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在sringboot中使用@ControllerAdvice处理异常十分轻松,但是在使用的过程中踩到了个坑,浪费了一些时间。也是怪自己没有好好解读springboot的文档!

下面是我的@ControllerAdvice声明的全局异常处理类的代码:

@ControllerAdvice(basePackages = {"com.dmcn.oa"})
@ResponseBody  // 这样的话可以直接说用@RestControllerAdvice的
public class OAExceptionHandler {


	@ExceptionHandler({DuplicateKeyException.class})
	public ResponseData handleDuplicateKeyException(DuplicateKeyException e){
		logger.error(e.getMessage(), e);
		return ResponseData.error("数据库已经有这个记录,不需要再次存入",407);
	}


}

正常情况下当我com.dmcn.oa包下某个Controller出现异常,将会被捕捉到进行异常处理,返回我们指定的数据格式。但是这样配置返回的依然是springboot默认返回格式。

解决方案:

使用@ExceptionHandler注解返回值最好是Map,重要的是返回结果中键的值不能为null。

原来我自定义的返回结构中存在null,就像这样,就不会正常返回奇怪得很:

public static Map newResult(String msg, int code, Object data){
        Map map = new HashMap();
        map.put("code",code);
        map.put("msg",msg);
        map.put("data",null);
        return map;
    }

————————————————————————————————————————————————————————

这是我发现的坑,当然还有其他人的,这里我就把别人发现问题引过来吧,方便以后查找

谢谢

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

善良的大铁牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值