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

Kotlin中Spring REST的@ControllerAdvice与@ExceptionHandler无法触发

解决Spring @ControllerAdvice异常处理器未被调用的问题

我来帮你排查下这个异常处理器没被触发的问题,大概率是下面几个常见原因导致的,咱们一个个来核对:

  • 检查类的访问权限:你写的APIExceptionHandler用了默认的包级访问权限(没加public),Spring的组件扫描机制可能没法识别到这个类。给它加上public修饰符,确保Spring能把它纳入上下文管理:

    @ControllerAdvice
    public class APIExceptionHandler : ResponseEntityExceptionHandler() {
        @ExceptionHandler(value = [(TestException::class)])
        fun handleConflict(exception: TestException, request: WebRequest): ResponseEntity<Any> {
            println("Handle")
            return handleExceptionInternal(exception, "Request failed: ${exception.message}", HttpHeaders(), HttpStatus.CONFLICT, request)
        }
    }
    
  • 确认异常的抛出逻辑:首先得保证你在控制器方法里确实抛出了TestException。如果这个异常是受检异常(继承自Exception而非RuntimeException),那你需要在控制器方法上声明throws TestException,或者干脆把TestException改成运行时异常,这样就不用显式声明了:

    // 改成运行时异常,抛出时无需在方法上声明
    class TestException(message: String) : RuntimeException(message)
    
  • 验证组件扫描范围:检查你的@SpringBootApplication(或者配置类上的@ComponentScan)是否覆盖了APIExceptionHandler所在的包。如果处理器放在了单独的子包下,得显式指定扫描路径,不然Spring找不到它:

    @SpringBootApplication(scanBasePackages = ["com.yourproject.controller", "com.yourproject.exception.handler"])
    class YourApplication
    
  • 排查局部异常处理器冲突:如果你的控制器类自己定义了@ExceptionHandler来处理TestException,那局部的处理器会优先于全局的@ControllerAdvice处理器。如果不需要局部处理,把控制器里的相关方法删掉就行。

  • 修正handleExceptionInternal的调用参数:你当前调用handleExceptionInternal时参数不全,缺少HTTP头和状态码,这可能导致处理逻辑异常。建议补充完整参数,明确指定响应的状态码,这样不仅能触发处理器,还能返回正确的响应信息。

内容的提问来源于stack exchange,提问作者Marcel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:36:07