首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当实现接口时,Spring-Retry无法定位恢复方法。

当实现接口时,Spring-Retry无法定位恢复方法。
EN

Stack Overflow用户
提问于 2018-11-05 07:56:15
回答 2查看 7K关注 0票数 4

我在做弹簧重试时发现了一个问题。当一个类实现一个接口时,它不能在超过最大重试次数之后进入@recover方法。但是当我注入一个正常的类,我可以输入这个method.Your提示帮助和善意的建议将不胜感激,谢谢!

当我这样做时,我可以输入@Recover方法

代码语言:javascript
复制
@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;
    }
}

但是一旦这个类实现了另一个接口,它就不能工作了

代码语言:javascript
复制
@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;
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-05 09:24:33

Spring使用AOP实现@Retry。在使用AOP时,默认情况是使用JDK动态代理。JDK动态代理是基于接口的。

这意味着您得到了一个动态创建的类,它预先准备成为一个TestServiceI,但是它不是一个TestService。代理不包括recover方法(因为它不在接口上),因此Spring无法检测它。

要解决这个问题,需要通过将proxyTargetClass属性设置为true (参见javadoc),从而为Spring启用基于类的代理。

代码语言:javascript
复制
@EnableRetry(proxyTargetClass=true) 
票数 6
EN

Stack Overflow用户

发布于 2021-07-20 03:22:17

  1. mark proxyTargetClass=true:@EnableRetry(proxyTargetClass = true)
  2. @Recover方法必须返回与原始方法相同的类型;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53150345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档