resilience4j аннотации не работают на классе chlid - PullRequest
1 голос
/ 22 апреля 2020

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

Resilience4j Config

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

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

1 Ответ

1 голос
/ 23 апреля 2020

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

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

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

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

...