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

Spring自定义异常未返回正确提示信息问题求助

解决自定义RecordNotFoundException未生效的问题

看起来你遇到了全局异常处理器没按预期接管自定义异常的问题,我来帮你排查一下可能的原因和解决办法:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 20:12:49