Я пытался выяснить, как перехватывать методы, определенные в клиенте 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?