跨模块复用@RestControllerAdvice时Postman不返回自定义异常问题咨询
问题排查与解决方案
核心原因(90%概率)
你定义在独立模块的GlobalExceptionHandle类没有被业务模块的Spring容器扫描到,导致全局异常处理逻辑根本没有生效,Spring使用了默认的异常处理规则返回响应,所以不会返回你自定义的响应结构。
完整排查步骤
1. 验证全局异常类是否被Spring加载
这是最常见的问题,Spring Boot默认只会扫描启动类所在包及其子包下的Bean,独立模块的包名通常和业务模块不同,就会导致@RestControllerAdvice注解的类没被识别:
- 验证方法:可以在
GlobalExceptionHandle的构造方法里加一行打印日志,启动业务模块如果没输出日志,说明类没有被实例化。 - 解决方案二选一:
- 方案1:修改业务模块启动类的
@SpringBootApplication注解,增加独立模块的包扫描路径:// 替换为你独立模块中GlobalExceptionHandle所在的父包名 @SpringBootApplication(scanBasePackages = {"com.xxx.business", "com.xxx.common"}) - 方案2:给独立模块配置Spring Boot自动装配(更适合复用场景,不需要业务模块修改代码):
在独立模块的resources目录下新建META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,写入GlobalExceptionHandle的全限定类名,示例:com.xxx.common.exception.GlobalExceptionHandle
- 方案1:修改业务模块启动类的
2. 检查自定义响应类的序列化配置
确认你的CustomExceptionResponseDto类所有字段都有公开的Getter方法,如果用Lombok直接给类加@Data注解即可,否则Jackson无法序列化字段,会返回空响应或者默认错误结构。
3. 排查是否存在冲突的异常处理器
检查项目中是否存在其他@RestControllerAdvice注解的类,若其他异常处理器优先级更高、或者也声明了对InvalidStateException的处理,会覆盖你当前的逻辑。你已经给当前类加了@Order(Ordered.HIGHEST_PRECEDENCE)最高优先级,该问题概率较低。
4. 验证异常匹配逻辑
你抛出的EmailAlreadyUseException继承自InvalidStateException,和你声明的@ExceptionHandler(InvalidStateException.class)是匹配的,该逻辑本身没有问题,可以在异常处理方法里加一行日志,验证请求报错时是否进入了该方法。
内容的提问来源于stack exchange,提问作者Nursultan
相关产品推荐
相关产品推荐

