如何创建CDI拦截器,以从Feign客户处建议方法?

问题描述 投票:0回答:1

我一直在尝试找出如何使用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中的拦截器模式?

cdi interceptor feign
1个回答
2
投票

简短的,有些错误的答案是:您不能。如果可能的话,InterceptionFactory的确是您将要做的。

更长的答案是这样的:

  1. 使用java.lang.reflect.Proxy创建MyRepository接口的代理实现。
  2. 创建一个InvocationHandler,以执行所需的任何方法的拦截。
  3. 在该代理实现中目标伪装。
© www.soinside.com 2019 - 2024. All rights reserved.