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无法感知到该异常的存在,自然不会调用对应的全局异常处理器。
解决方案
移除全局异常捕获块
删除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); } }若需保留全局捕获,需重新抛出目标异常
如果必须保留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
相关产品推荐
相关产品推荐

