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?
答案 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相同(哦,恐怖!)等。