Netflix Feign:404 上 ErrorDecoder 中的响应正文为空
Posted
技术标签:
【中文标题】Netflix Feign:404 上 ErrorDecoder 中的响应正文为空【英文标题】:Netflix Feign: Response Body empty in ErrorDecoder on 404 【发布时间】:2016-05-07 13:58:33 【问题描述】:我已经实现了一个自定义的 ErrorDecoder:
public class WebShopErrorDecoder implements ErrorDecoder
@Override
public Exception decode(String methodKey, Response response)
JacksonDecoder jacksonDecoder = new JacksonDecoder();
try
ErrorResource error = (ErrorResource) jacksonDecoder.decode(response, ErrorResource.class);
return new EShopRequestException(error, HttpStatus.valueOf(response.status()));
catch (IOException e)
return new EShopRequestException(new ErrorResource("error.internal", "Internal server error"),
HttpStatus.INTERNAL_SERVER_ERROR);
我想用这个WebShopErrorDecoder
ist 来转发错误响应。
我的问题是,如果响应状态为 404,则 ErrorResource error
为空。
如果我将返回的响应状态更改为 400,例如错误资源包含响应。
当直接通过浏览器请求使用的服务时,我可以看到响应状态为 404 的响应正文。
为什么服务返回 404 时 feign 请求的响应体为空? 有没有办法获取响应正文?
我刚开始使用 feign,所以如果我的问题不清楚,请告诉我,我会尝试澄清缺少的内容。
提前致谢!
【问题讨论】:
【参考方案1】:好的,我刚刚发现响应为空的原因。这不是我的错。
由于我使用 JacksonDecoder,如果响应状态为 404,由于 JacksonDecoder 中的以下代码,我总是得到一个空响应。
..
public Object decode(Response response, Type type) throws IOException
if(response.status() == 404)
return Util.emptyValueOf(type);
..
我正在做的是使用ResponseEntityDecoder
。
public class WebShopErrorDecoder implements ErrorDecoder
private final ResponseEntityDecoder decoder;
public WebShopErrorDecoder(ResponseEntityDecoder decoder)
this.decoder = decoder;
@Override
public Exception decode(String methodKey, Response response)
try
ErrorResource error = (ErrorResource) decoder.decode(response, ErrorResource.class);
return new EShopRequestException(error, HttpStatus.valueOf(response.status()));
catch (IOException e)
return new EShopRequestException(new ErrorResource("error.internal", "Internal server error"),
HttpStatus.INTERNAL_SERVER_ERROR);
现在一切正常:)
【讨论】:
以上是关于Netflix Feign:404 上 ErrorDecoder 中的响应正文为空的主要内容,如果未能解决你的问题,请参考以下文章
使用 Netflix Feign 和 Hystrix 设置请求超时
如何使用 spring-cloud-netflix 和 feign 编写集成测试