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

Spring Retry问题:@Recover注解方法未被调用

解决Spring Retry @Recover方法无法触发的问题

我看到你在测试Spring Retry时遇到了Cannot locate recovery method的异常,折腾了参数配置、依赖版本、AOP依赖都没解决,其实核心问题出在**@Recover方法的返回类型和@Retryable方法不匹配**上,咱们来一步步修复:

核心问题分析

你的@Retryable方法getInfo()返回的是String类型,但所有的@Recover方法都定义为void返回。Spring Retry在查找恢复方法时,要求恢复方法的返回类型必须与重试方法的返回类型兼容(相同或其子类),否则会判定找不到匹配的恢复方法,抛出ExhaustedRetryException。

修复方案

修改@Recover方法的返回类型为String,和重试方法保持一致,示例如下:

@Service
public class SomeService {
    @Retryable(value = ArithmeticException.class, maxAttempts = 3, backoff = @Backoff(delay = 3000))
    public String getInfo() {
        System.out.println("How many time will this be printed?");
        return "Hello" + 4/0;
    }

    @Recover
    public String helpHere(ArithmeticException cause) {
        System.out.println(cause);
        System.out.println("Recovery place!");
        // 返回一个恢复后的结果,符合方法返回类型要求
        return "Recovered from arithmetic error: " + cause.getMessage();
    }
}

其他需要确认的要点

除了返回类型,还有几个关键点你已经做对了,但再核对下更稳妥:

  • 已经在配置类上添加了@EnableRetry注解,开启Spring Retry功能
  • @Recover方法和@Retryable方法在同一个类中(这是默认要求,除非使用自定义恢复器)
  • @Recover方法的第一个参数是重试方法抛出的具体异常类型(ArithmeticException),匹配正确
  • 依赖配置没问题:spring-retry和spring-boot-starter-aop是Spring Retry正常工作的必要依赖,不需要移除

关于你尝试的try-catch版本

你添加的try-catch块其实没必要,@Retryable会自动捕获指定的异常并触发重试。不过即使保留try-catch,只要保证@Recover方法的返回类型和重试方法一致,就能正常触发恢复逻辑。

修改后再测试,重试3次后就会调用helpHere()方法,返回恢复后的结果,不会再抛出找不到恢复方法的异常了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:34:41