Spring中@ExceptionHandler映射冲突及重写编译错误求助
问题解决方法
编译错误原因及解决
父类的handleException方法被标记为final,子类无法重写该方法,这是编译错误的直接原因。首先修改父类代码,去掉final修饰符:
public abstract class ParentHandler extends ResponseEntityHandler { @ExceptionHandler(Exception.class) public ResponseEntity<String> handleException(Exception ex) { // 通用异常处理逻辑 return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Internal Server Error"); } }
运行时歧义异常解决
运行时出现java.lang.IllegalStateException: Ambiguous @ExceptionHandler method mapped的原因是:父类和子类都被@RestControllerAdvice标记,Spring会将两者都注册为全局异常处理器,导致同一个Exception.class存在两个处理方法,引发歧义。
方案一:父类作为抽象基类,仅子类注册为异常处理器
将父类改为抽象类并移除@RestControllerAdvice注解,仅在子类添加该注解。这样Spring只会注册子类作为异常处理器,子类重写父类方法后会覆盖通用逻辑,不会产生冲突:
子类代码修改如下:
@RestControllerAdvice public class ChildHandler extends ParentHandler{ @Override public ResponseEntity<String> handleException(Exception ex) { // 子类特定异常处理逻辑 return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Request"); } }
方案二:保留父类的@RestControllerAdvice,调整子类处理范围
如果必须保留父类的@RestControllerAdvice,可以让子类的@ExceptionHandler处理更具体的异常类型,而非直接覆盖Exception.class。例如子类只处理自定义的com.lan.exception异常:
@RestControllerAdvice public class ChildHandler extends ParentHandler{ @ExceptionHandler(com.lan.exception.class) public ResponseEntity<String> handleCustomException(com.lan.exception ex) { // 自定义异常处理逻辑 return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Custom Error"); } }
这种方式下,父类处理通用Exception,子类处理特定异常,两者各司其职,不会产生歧义。
内容的提问来源于stack exchange,提问作者khaja mohiddin
相关产品推荐
相关产品推荐

