Kotlin中Spring REST的@ControllerAdvice与@ExceptionHandler无法触发
我来帮你排查下这个异常处理器没被触发的问题,大概率是下面几个常见原因导致的,咱们一个个来核对:
检查类的访问权限:你写的
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

