当前位置: 首页 > 知识库问答 >
问题:

Spring-Retry在实现接口时无法定位恢复方法

逑俊楚
2023-03-14
@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;
    }
}

共有1个答案

董庆
2023-03-14

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

这意味着您得到了一个动态创建的类,它假装是TestServicei,但它不是TestService。代理不包括recovery方法(因为它不在接口上),因此Spring重试无法检测到它。

为了解决这个问题,您需要通过将@enableretry上的proxytargetclass属性设置为true来为Spring重试启用基于类的代理(请参见javadoc)。

@EnableRetry(proxyTargetClass=true) 
 类似资料:
  • 本文向大家介绍Mongodb实现定时备份与恢复的方法教程,包括了Mongodb实现定时备份与恢复的方法教程的使用技巧和注意事项,需要的朋友参考一下 本文主要介绍了关于Mongodb实现定时备份与恢复的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: MongoDB 数据备份 在 MongoDB 中我们使用 mongodump 命令来备份 MongoDB 数据 语法如下: -h Mong

  • 当我运行单元测试时,我希望thisFails()方法重试3次,然后我希望看到recovery logger行打印出来,但它只尝试一次,然后抛出异常。底部的输出是在我运行测试之后。 我错过了什么? 请忽略此部分,然后跳到代码。门楣匠认为我没有足够的说明来张贴。我认为这样的措辞足以让我的问题被人理解,但出于某种原因,我不允许发布这个问题,除非我写更多的东西。还有更多的东西,等等。 --Spring启动

  • Override Method可以实现接口方法也可以覆写父类的方法,但Implement Methods只能实现接口方法 操作步骤: 菜单栏: Code —> Implement Methods 快捷键: Mac: control + L Windows\/Linux: Ctrl + I

  • 我是Spring Boot的新手,所以我有几个基本问题。 当我们定义一个扩展JpaRepostory的Repostory接口时 这些方法可以从 Service 类调用(我们可能甚至不需要提及这两个方法)。到目前为止,一切都很好。 问题: > 方法是如何定义的?它在幕后是如何被称为的? 如果我们想用原生SQL添加一个自定义方法< code>findUserAction呢?在这种情况下,我们需要在<

  • 问题内容: 我有一个定义方法的接口。我有一个 实现 此接口的结构。在其中,我已经从该接口实现了方法,并且还定义了其他方法。 例如: 在操场上:https : //play.golang.org/p/B1GgoNToNl_l 在此,WagTail()不是Animal接口的一部分,但属于Dog结构。运行此代码会出现错误 dog.WagTail未定义(动物类型没有字段或方法WagTail)。 有没有一种

  • 问题内容: 但是那里给出的解决方案不起作用。他们说我需要采取以下行动: 在项目结构中| 在“项目”对话框中,在界面中将“项目语言级别”更改为6.0-@Override。 但是,目前项目语言级别是6.0,但是我仍然看到错误。 维克(Vic),这是一个窗口,并且在语言级(Language level)下没有JVM版本(不幸的是,由于我有10个信誉,所以我无法发布图像) 问题答案: 如果您的项目有多个模