【问题标题】:Netflix Feign: Response Body empty in ErrorDecoder on 404Netflix Feign:404 上 ErrorDecoder 中的响应正文为空
【发布时间】: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,所以如果我的问题不清楚,请告诉我,我会尝试澄清缺少的内容。

提前致谢!

【问题讨论】:

    标签: java spring netflix-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);
        }
      }
    }
    

    现在一切正常:)

    【讨论】:

      猜你喜欢
      • 2019-06-12
      • 1970-01-01
      • 2022-11-30
      • 2019-04-30
      • 2019-12-02
      • 2020-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多