Как создать CDI Interceptor, который консультирует методы от клиента Feign? - PullRequest
0 голосов
/ 18 апреля 2020

Я пытался выяснить, как перехватывать методы, определенные в клиенте Feign, с помощью перехватчиков CDI (1.2). Мне нужно перехватить значение ответа, которое возвращает клиент, и извлечь данные для регистрации и удалить некоторые данные до того, как они будут возвращены вызывающему процессу.

Я использую контейнер Weld 2.3, который предоставляет CDI 1.2. В нем я хотел бы создать перехватчик CDI, который запускается каждый раз, когда выполняется вызов filter().

public interface MyRepository {
    @RequestLine("POST /v1/data/policy/input_data_filtered")
    JsonNode filter(Body body);
}

и соответствующий метод источника:

@Produces
public MyRepository repositoryProducer() {
    return Feign.builder()
            .client(new ApacheHttpClient())
            .encoder(new JacksonEncoder(mapper))
            .decoder(new JacksonDecoder(mapper))
            .logger(new Slf4jLogger(MyRepository.class))
            .logLevel(feign.Logger.Level.FULL)
            .target(MyRepository.class,  "http://localhost:9999");
}

Я попробовал стандартный способ перехватчика CDI, создав @InterceptorBinding и добавив его в определение интерфейса, но это не не работает Я подозреваю, потому что перехватчик должен быть применен к компоненту CDI (прокси) и не может быть определен в интерфейсе. Я попытался применить его к методу repositoryProducer(), но он тоже не работал.

Я читал о javax.enterprise.inject.spi.InterceptionFactory, который доступен в CDI 2.0, но у меня нет к нему доступа.

Как я могу сделать это в CDI 1.2? Или, в качестве альтернативы, есть ли лучший шаблон перехватчика, который я могу использовать, как-то встроенный в Feign?

1 Ответ

2 голосов
/ 18 апреля 2020

Короткий, несколько неправильный ответ: вы не можете. InterceptionFactory действительно, как вы бы это сделали, если бы могли.

Более длинный ответ выглядит примерно так:

  1. Используйте java.lang.reflect.Proxy для создания прокси-реализации MyRepository interface.
  2. Создайте InvocationHandler, который выполняет перехват вокруг любых методов, которые вы хотите.
  3. Target Feign в этой прокси-реализации.
...