Spring自定义异常未返回正确提示信息问题求助
看起来你遇到了全局异常处理器没按预期接管自定义异常的问题,我来帮你排查一下可能的原因和解决办法:
1. 移除异常类上的@ResponseStatus注解,避免冲突
你的RecordNotFoundException上标注了@ResponseStatus(HttpStatus.NOT_FOUND),同时又在ApiExceptionHandler里写了专门的异常处理方法。这时候Spring可能会优先使用注解的默认处理逻辑,而不是你的全局处理器。
修改你的自定义异常类:
// 移除@ResponseStatus注解 public class RecordNotFoundException extends RuntimeException { public RecordNotFoundException(String exception) { super(exception); } }
2. 确保全局异常处理器被Spring扫描到
检查ApiExceptionHandler类所在的包是否被Spring的组件扫描覆盖。比如如果你的主应用类(带@SpringBootApplication的类)在com.example.demo,而异常处理器在com.example.demo.exception,那默认的组件扫描是会覆盖子包的;如果不在同一个根包下,需要在主类上添加@ComponentScan(basePackages = {"com.example.demo", "com.example.exception"})来指定扫描路径。
3. 验证异常触发逻辑是否正确
在你的getConfig方法里,确认当result.isEmpty()时确实会抛出异常,同时可以补全错误信息的空格提升可读性:
@RequestMapping(value = "/config", params = { "appCode", "appVersion" }, method = RequestMethod.GET) public ResponseEntity<ConfigResponse> getConfig(@RequestParam(value = "appCode", required = true) String appCode, @RequestParam(value = "appVersion", required = true) String appVersion) { List<AppConfig> result = configRepository.findByCodeAndVersion(appCode, appVersion); // 可添加日志验证是否进入抛异常分支 if (result.isEmpty()) { throw new RecordNotFoundException(appCode + " or " + appVersion + " does not exist"); } AppConfig config = new AppConfig(); return new ResponseEntity<ConfigResponse>(config.convertToResponse(result), HttpStatus.OK); }
4. 检查是否有其他全局异常处理器冲突
如果项目里还有其他标注@ControllerAdvice的类,尤其是那些处理Exception.class或者RuntimeException.class的,可能会提前拦截你的RecordNotFoundException。可以暂时注释掉其他处理器,测试是否你的ApiExceptionHandler能正常工作。
做完这些调整后,再测试触发记录不存在的场景,应该就能返回你自定义的ErrorMessage结构和404状态码了。
内容的提问来源于stack exchange,提问作者WISHY

