处理FeignClient

时间:2017-01-26 14:14:23

标签: spring netflix-feign

FeignClient是一个非常漂亮的工具,但不幸的是,如果你需要做一些与春天的神意图有点不同的事情,你就会受到伤害。

当前案例:我使用外部第三方REST服务,该服务有关于REST的有趣的概念。特别是,如果您向他们发送正确的JSON,他们会在正文中返回HTTP 302和JSON。

不用说,FeignClient真的,真的不喜欢这种恶作剧。我的界面:

@FeignClient(value = "someClient", configuration = SomeClientDecoderConfiguration.class)
public interface SomeClient {
    @RequestMapping(method = RequestMethod.POST, path = "${someClient.path}",
    produces = MediaType.APPLICATION_JSON_VALUE)
    JsonOrderCreateResponse orderCreate(JsonOrderCreateRequest request, @RequestHeader("Authorization") String authHeader);
}

我已经有自定义配置和错误解码器,但这些只适用于HTTP 4xx和5xx。如果系统遇到302,它最终会像:

http://pastebin.com/raw/cGKWc4yg

如何防止这种情况并强制FeignClient像200那样处理302?

1 个答案:

答案 0 :(得分:0)

虽然没有办法迫使FeignClient正常处理超过2xx的任何事情而没有疯狂的解决方法,但有办法以最小的麻烦来处理它。请注意,您需要最近的版本!我不得不在POM中输入:

SpatialDropout2D(0.2)

那么,怎么做呢?

在任何方法的假装客户端实现中,您需要返回Response。那就是它。

如果您返回Response,框架将以特殊方式运行 - 如果状态超过2xx,它将不会抛出任何异常,也不会尝试重试多次,就像一些......有天赋的......孩子。换句话说,没有恶作剧。耶!

示例:

<dependency>
    <groupId>com.netflix.hystrix</groupId>
    <artifactId>hystrix-core</artifactId>
    <version>1.5.9</version>
</dependency>

当然,您需要亲自处理响应(前面提到的最小麻烦):

import feign.Response;

@RequestMapping(method = RequestMethod.POST, path = "${someClient.path}")
Response doThisOrThat(JsonSomeRequest someJson, @RequestHeader("Authorization") String authHeader);

然后你可以做你想做的任何事情,检查response.status()以抛出你自己的异常,用任何状态代码(如302)处理响应,方法与200相同(哦,恐怖!)等。