resilience4j 注释不适用于 chlid class

resilience4j annotations not working on chlid class

我在 SpringBoot 中使用 resilience4j。我看到只有将 resilience4j 注释放在 class 中才会引发异常。如果 class 由另一个 class 扩展并且 parent class 有注释,则重试不起作用。

Resilience4j 配置

resilience4j.retry: 
  instances:       
    service: 
      maxRetryAttempts: 5
      waitDuration: 1000
      retryException: 
        - com.common.exception.RetriableException

Parent Class

@Retry(name = "service")
@Component
public class httpClient extends client{

  // This method is invoked from outside
  public HttpResponse<T> getResponse(
      String url, Class<T> responseType) {
    return super.getResponse(url, requestEntity, responseType);
  }
}

Child Class

@Retry(name = "service") // Without this line, the retries don't work, even though it is present in the parent class
@Component
public class client{

  public HttpResponse<T> getResponse(
      String url, Class<T> responseType) {
    //Impl which throws RetriableException
  }
}

这是预期的行为吗?如果我遗漏了什么,你能告诉我吗

我以前从未使用过 Resilience4j,但关于 Java 注释,我可以告诉您的一般情况是:

  • 子class中的重写方法从不继承原始父class方法的注解。
  • 在实现接口的class中,实现方法从不从相应的接口方法继承注解。
  • 实现接口的 classes 从不 从接口本身继承注解。
  • 扩展另一个接口的接口也从不继承任何类型或方法级别的注释。
  • 默认情况下,即使是子class 也不会继承其父class 的注解。
  • 这个"annotations are never inherited"规则有一个例外:类型级别注释(类似于@Foo class Base,也可以是抽象的)可以 被子class 继承(类似class Sub extends Base当且仅当 注释 class 本身带有元注释 @Inherited.

话虽如此并查看 @Retry 注释,您会注意到那里没有 @Inherited 注释,因此它也不适用于您的情况。

如果有其他方法(例如通过反射)在 Resilience4j 中完成此操作,我不知道,因为正如我所说,我以前从未使用过它。