实施接口时,Spring-Retry无法找到恢复方法

时间:2018-11-05 07:56:15

标签: java spring spring-boot spring-retry

用弹簧靴进行弹簧重试时发现一个问题。当一个类实现一个接口时,在超过最大重试次数后,它不能进入​​@recover方法。但是,当我注入普通班级时,我可以输入此方法。谢谢您的及时帮助和友善的建议!

  

执行此操作时,我可以输入@Recover方法

@Service
public class TestService {

    @Retryable(Exception.class)
    public String retry(String c) throws Exception{
        throw new Exception();
    }

    @Recover
    public String recover(Exception e,String c) throws Exception{
        System.out.println("got error");
        return null;
    }
}
  

但是一旦类实现了另一个接口,它就无法工作

@Service
public class TestService implements TestServiceI{

    @Override
    @Retryable(Exception.class)
    public String retry(String c) throws Exception{
        throw new Exception();
    }

    @Recover
    public String recover(Exception e,String c) throws Exception{
        System.out.println("got error");
        return null;
    }
}

2 个答案:

答案 0 :(得分:2)

Spring-Retry使用AOP来实现@Retry。使用AOP时,默认值为使用JDK动态代理。 JDK动态代理基于接口。

这意味着您将获得一个动态创建的类,该类伪装为TestServiceI,但不是TestService。代理不包含recover方法(因为它不在接口上),因此Spring Retry无法检测到它。

要解决此问题,您需要通过将proxyTargetClass上的@EnableRetry属性设置为true(请参见javadoc)来启用Spring Retry的基于类的代理。

@EnableRetry(proxyTargetClass=true) 

答案 1 :(得分:0)

  1. 标记 proxyTargetClass=true: @EnableRetry(proxyTargetClass = true)
  2. @Recover 方法必须返回与原始方法相同的类型;