SpringBoot简历项目自定义RestExceptionHandler异常处理器不生效求助
问题原因排查及解决方案
核心问题原因
- @RestControllerAdvice配置错误
@RestControllerAdvice是针对Controller层的异常增强组件,仅会捕获从Controller层向上抛出的异常。你当前配置的basePackages = "com.cvresumeproject.cvresumeproject.service.*"指向Service包,且末尾多余加了.*通配符,就算异常从Service抛到Controller,异常处理器也扫描不到对应的Controller,无法触发捕获逻辑。 - 启动类@ComponentScan配置错误
你在启动类上强制指定
@ComponentScan扫描单个类的路径,直接覆盖了SpringBoot默认的包扫描规则,会导致Controller、Service等其他业务组件无法被Spring容器加载,自然异常流转链路也无法被异常处理器感知。 - Service层未主动抛出自定义异常
你写的业务代码直接调用
templateRepository.findById(id).get(),如果ID不存在,JPA的Optional.get()会直接抛出NoSuchElementException,没有触发CustomNotFoundException的抛出逻辑,异常处理器自然捕获不到对应类型的异常。
修复步骤
- 修正启动类配置
移除错误的@ComponentScan配置,使用SpringBoot默认的包扫描规则即可:
@SpringBootApplication public class CvresumeprojectApplication { public static void main(String[] args) { SpringApplication.run(CvresumeprojectApplication.class, args); } }
- 修正全局异常处理器配置
调整@RestControllerAdvice的扫描范围为Controller所在包,或者直接省略basePackages属性默认扫描所有Controller:
@Order(Ordered.HIGHEST_PRECEDENCE) @RestControllerAdvice(basePackages = "com.cvresumeproject.cvresumeproject.controller") public class RestExceptionHandler { @ExceptionHandler(value = CustomNotFoundException.class) protected ResponseEntity<Object> handleEntityNotFound(CustomNotFoundException exception){ ApiError apiError = new ApiError(HttpStatus.NOT_FOUND); apiError.setMessage(exception.getMessage()); return new ResponseEntity<>(apiError, apiError.getStatus()); } }
- 修正Service层异常抛出逻辑
先判断查询结果是否为空,为空时手动抛出自定义异常:
@Override public TemplateDto findById(Long id) throws CustomNotFoundException { Template template = templateRepository.findById(id) .orElseThrow(() -> new CustomNotFoundException("ID为" + id + "的模板不存在")); return templateMapper.templateToTemplateDto(template); }
内容的提问来源于stack exchange,提问作者rtyuttter
相关产品推荐
相关产品推荐

