我需要拦截HTTP响应并更改HTTP状态代码。例如,我可能会将200更改为400(基于响应对象本身),以便调用ErrorDecoder。
我需要在不扩展feign.Client
类的情况下执行此操作!(实际上,我使用的feign.httpclient.ApacheHttpClient
是final!)
我试图为ResponseMapper
提供一个实现,但似乎只有在AsyncResponseHandler#handleResponse
内部完成HTTP状态检查后,才能调用响应Map器(以及我用来覆盖的Decoder
)!
我在这里主要讨论SynchronousMethodHandler和AsyncResponseHandler的实现方式。
总结一下,我的主要问题是AsyncResponseHandler#handleResponse
在ErrorDecoder
之前没有调用Decoder
(因此是ResponseMapper
),如果它调用了Decoder
,那么ResponseMapper
可以执行我需要的HTTP状态代码。
2条答案
按热度按时间46scxncf1#
为了克服这个缺点,我将引用代码中的实现类(而不是依赖于spring Boot 的自动配置)
bnl4lu3b2#
SynchronousMethodHandler使用feign.Logger打印假装请求过程前后的日志,除非日志级别为NONE,调用顺序如下:
logger.logResuest(configKey, logLevel, request)
response = client.execute(request, options)
response = logger.logAndRebufferResponse(configKey, logLevel, response, elapsedTime)
此记录器是由**DefaultFeignLoggerFactory#create()**创建的。如果您定义自己的记录器并将其注册为SringBean,DefaultFeignLoggerFactory应使用自己的记录器来打印日志,您可以在
FeignClientsConfigurations
中看到记录器为@Autowired(required = false)
。因此您应定义自己的记录器,例如:然后将此类注册为Bean:
这很管用。