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
相关产品推荐
相关产品推荐

