我一直在尝试找出如何使用CDI(1.2)拦截器拦截在Feign客户端中定义的方法。我需要截获客户端返回的响应值,并提取数据以记录日志并删除一些数据,然后再将其返回给调用过程。
我正在运行提供CDI 1.2的Weld 2.3容器。在其中,我想创建一个CDI拦截器,该调用在每次调用filter()
时触发。
public interface MyRepository {
@RequestLine("POST /v1/data/policy/input_data_filtered")
JsonNode filter(Body body);
}
和一个匹配的Producer方法:
@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");
}
我已经尝试过通过创建@InterceptorBinding
并将其添加到接口定义中来尝试标准CDI拦截器的方法,但这没有用。我怀疑是因为拦截器必须应用于CDI bean(代理),并且不能在接口中定义。我尝试将其应用于repositoryProducer()
方法,但这也无法正常工作。
我已经阅读了CDI 2.0中提供的javax.enterprise.inject.spi.InterceptionFactory
,但我无权访问。
如何在CDI 1.2中执行此操作?或者,是否可以使用某种更好的内置在Feign中的拦截器模式?
简短的,有些错误的答案是:您不能。如果可能的话,InterceptionFactory
的确是您将要做的。
更长的答案是这样的:
java.lang.reflect.Proxy
创建MyRepository
接口的代理实现。InvocationHandler
,以执行所需的任何方法的拦截。