You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 2.7.1中ResponseEntityExceptionHandler未触发问题求助

异常处理器未生效的原因分析与解决

核心问题

你的控制器方法中通过catch (Exception e)捕获了所有异常,包括自定义的RoomNotFoundException,导致异常被提前拦截并仅打印堆栈,最终返回null而非将异常抛出到Spring的全局异常处理机制中,因此@ControllerAdvice定义的异常处理器从未接到触发信号。

具体代码问题点

在WebServiceController的getRooms方法中,抛出RoomNotFoundException后,会被后续的catch (Exception e)块捕获:

catch (Exception e) {
    e.printStackTrace(); // 仅打印堆栈,未重新抛出异常
}
return null; // 返回null,接口响应200空内容

这种处理方式直接阻断了异常的向上传递,Spring无法感知到该异常的存在,自然不会调用对应的全局异常处理器。

解决方案

  1. 移除全局异常捕获块
    删除catch (Exception e)代码块,让RoomNotFoundException能够正常抛出到Spring容器中,触发全局处理器:

    @RequestMapping(path = "/jpa/getroomId/{id}", method = RequestMethod.GET)
    public Room getRooms(@PathVariable String id) throws RoomNotFoundException {
    
        Optional<Room> optionalRoom;
        try {
            optionalRoom = reservationService.getRoomDetail(Integer.parseInt(id));
            if (!optionalRoom.isPresent()) {
                throw new RoomNotFoundException("Room Id is incorrect:" + id);
            }
            return optionalRoom.get();
    
        } catch (NumberFormatException e) {
            throw new IllegalArgumentException("Invalid room ID format: " + id, e);
        }
    }
    
  2. 若需保留全局捕获,需重新抛出目标异常
    如果必须保留catch (Exception e)块,需在其中判断异常类型,重新抛出RoomNotFoundException:

    catch (Exception e) {
        if (e instanceof RoomNotFoundException) {
            throw (RoomNotFoundException) e; // 重新抛出,让全局处理器捕获
        }
        e.printStackTrace();
        throw new RuntimeException("Unexpected error", e);
    }
    

额外检查点

  • 确认RoomNotFoundException类已正确定义,且属于Spring扫描范围内的类;
  • 确认@ControllerAdvice所在包被Spring组件扫描覆盖(若与主启动类包层级不一致,需通过@ComponentScan指定扫描范围);
  • 继承ResponseEntityExceptionHandler后,无需额外添加@ResponseBody(@ExceptionHandler结合ResponseEntity已支持返回JSON响应)。

内容的提问来源于stack exchange,提问作者Khushboo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 11:48:27