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);
    
  

我想用这个WebShopErrorDecoderist 来转发错误响应。 我的问题是,如果响应状态为 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 和 openfeign 的区别

使用 Netflix Feign 和 Hystrix 设置请求超时

如何使用 spring-cloud-netflix 和 feign 编写集成测试

Spring-Cloud之Feign

Spring Cloud Netflix:使用 Feign 处理远程服务错误

什么是Netflix Feign?它的优点是什么?