Spring Boot @ControllerAdvice全局异常处理失效原因排查
全局异常处理失效原因及解决方法
问题根源
你的@ExceptionHandler注解同时声明了BadRequestException::class和HttpMessageNotReadableException::class两个异常类型,但处理方法badRequestExceptionHandler的参数仅接受BadRequestException类型。当触发HttpMessageNotReadableException(比如请求参数格式不符合要求)时,Spring无法将该异常实例注入到参数类型不匹配的方法中,导致参数解析失败(即日志中java.lang.IllegalStateException: Could not resolve parameter [0]错误),最终ExceptionHandlerExceptionResolver放弃执行该自定义处理方法,转而使用默认异常处理逻辑。
另外注意:原代码中的logger未初始化,运行时会触发空指针异常,需要补充初始化逻辑。
解决方案
有两种常见修复方式:
1. 拆分独立处理方法
为每个异常类型单独编写处理方法,确保方法参数与注解声明的异常类型严格匹配:
@ControllerAdvice class SageExceptionHandler { private val logger = LoggerFactory.getLogger(javaClass) @ExceptionHandler(BadRequestException::class) fun handleBadRequest(e: BadRequestException): ResponseEntity<Unit> { logger.error("处理BadRequestException") return ResponseEntity.badRequest().build() } @ExceptionHandler(HttpMessageNotReadableException::class) fun handleMessageNotReadable(e: HttpMessageNotReadableException): ResponseEntity<Unit> { logger.error("处理HttpMessageNotReadableException") return ResponseEntity.badRequest().build() } }
2. 统一参数类型(适用于处理逻辑一致的场景)
如果两个异常的处理逻辑完全相同,可以将方法参数改为它们的共同父类(如Exception),同时保留@ExceptionHandler中的多异常声明:
@ControllerAdvice class SageExceptionHandler { private val logger = LoggerFactory.getLogger(javaClass) @ExceptionHandler(value = [BadRequestException::class, HttpMessageNotReadableException::class]) fun handleBadRequestExceptions(e: Exception): ResponseEntity<Unit> { logger.error("处理请求错误异常: ${e.javaClass.simpleName}") return ResponseEntity.badRequest().build() } }
内容的提问来源于stack exchange,提问作者SageJustus
相关产品推荐
相关产品推荐

