Аннотации resilience4j не работают в классе chlid

Я использую resilience4j с SpringBoot. Я вижу, что аннотации resilience4j работают, только если они помещены в класс, который вызывает исключение. Если класс расширен другим классом и родительский класс имеет аннотацию, то повторные попытки не работают.

Конфигурация Resilience4j

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

Родительский класс

@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);
  }
}

Детский класс

@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
  }
}

Это ожидаемое поведение? Можете ли вы сообщить мне, если я что-то упускаю?


person Suraj Menon    schedule 22.04.2020    source источник


Ответы (1)


Я никогда раньше не использовал Resilience4j, но в целом могу рассказать вам об аннотациях Java:

  • Переопределенный метод в подклассе никогда не наследует аннотации от исходного метода родительского класса.
  • В классе, реализующем интерфейс, реализующий метод никогда не наследует аннотации от соответствующего метода интерфейса.
  • Классы, реализующие интерфейс, никогда не наследуют аннотации самого интерфейса.
  • Интерфейс, расширяющий другой интерфейс, также никогда не наследует аннотации на уровне типа или метода.
  • По умолчанию даже подкласс не наследует аннотации от своего родительского класса.
  • Из этого правила «аннотации никогда не наследуются» есть единственное исключение: аннотация уровня типа (что-то вроде @Foo class Base, также может быть абстрактным) может быть унаследована подклассом ( что-то вроде class Sub extends Base) тогда и только тогда, когда сам класс аннотации несет метааннотацию _ 3_.

Сказав это и посмотрев на _ 4_, вы заметите, что там нет аннотации @Inherited, поэтому она также не может работать в вашем случае.

Если есть другой способ (например, через отражение) сделать это в Resilience4j, я не знаю, потому что, как я уже сказал, я никогда не использовал его раньше.

person kriegaex    schedule 23.04.2020