[问题] @Recover报错:cannot locate recovery method; nested exception xxx

本文介绍了在使用Spring的@Retryable和@Recover注解时,如何处理找不到补偿方法的错误。关键点包括:确保@Retryable和@Recover注解的方法在同一类内,@Recover方法的第一个参数必须为Throwable,返回值需一致。@Recover方法是异常补偿,不一定要在重试后执行。示例代码展示了正确配置和使用方式。
摘要由CSDN通过智能技术生成

在使用Spring的Retry注解时候,难免会遇到如标题中的报错。该错误就是找不到对应的补偿方法而导致的错误。那么,请确定你的程序:

  1. @Retryable 和 @Recover 所注解的方法是否都是某个接口的方法实现,如果是,使用 @EnableRetry(proxyTargetClass = true) 。 proxyTargetClass=true会使用cglib进行代理。(注意:一般都不是该问题。@Recover也可以不用在接口中声明,直接在实现类中编写即可)
  2. @Retryable 和 @Recover 是否有写在同一个类里面?需要在同一个类里面
  3. @Recover 方法第一个参数是否为Throwable异常?第一个参数需要是Throwable异常
  4. @Retryable 和 @Recover 方法返回值是否不一致?除去第一个异常参数不谈,有其他参数的话需要保持一致
  5. 对 @Recover 注解的作用是否有理解上的偏差。@Recover 注解的方法是补偿方法并不是一定要重试之后才进入,只要被 @Retryable 注解的方法抛异常都会进入 @Recover 注解的方法里进行补偿。所以这就要求如果你只希望对某个异常进行重试,但你的 @Retryable 注解的方法又同时会抛出其他异常,这个时候你需要写一个支持所有异常的 @Recover 方法或者分为重试异常的和所有异常的两个 @Recover 方法。如下:
import org.springframework.retry.annotation.EnableRetry;

/**
 * 启动器.
 */
@EnableRetry(proxyTargetClass = true)
@SpringCloudApplication
public class DemoApplication {
  ...
}


/**
 * 接口.
 */
public interface IDemo {
  
    /**
     * 需要重试的方法.
     */
    void retry(int num)

    /**
     * 除数为0异常补偿方法.
     */
    void rcoverWithZero(ArithmeticException e, int num)

    /**
     * 其他所有异常补偿方法.
     */
    void recover(Exception e, int num)
}
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;

/**
 * 接口实现.
 */
public class DemoImpl implements IDemo {
  
    /**
	 * 需要重试的方法.
	 */
	@Override
	@Retryable(
		value = InvalidArgumentException.class,
		maxAttempts = 3,
		backoff = @Backoff(delay = 1000L, multiplier = 1.5)
	)
	public void retry(int num) throws InvalidArgumentException {
		if (num == 0) {
			throw new InvalidArgumentException(new String[] {});
		}
		int i = num / 0;
	}

	/**
	 * 除数为0异常补偿方法.
	 */
	@Override
	@Recover
	public void rcoverWithZero(ArithmeticException e, int num) {
		System.out.println("ArithmeticException异常重试次数过后依旧报错的补偿方法");
	}

	/**
	 * 其他所有异常补偿方法.
	 */
	@Override
	@Recover
	public void recover(Exception e, int num) {
		System.out.println("非ArithmeticException异常的补偿方法");
	}

}

作者有话说:如果有幸帮助到你,麻烦给个赞,给个收藏,给个关注,感谢!你的赞,收藏和关注是我的动力源泉

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值