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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:32:40