Netflix Feign:404中的ErrorDecoder中的响应正空

时间:2016-05-07 13:58:33

标签: java spring netflix-feign

我已经实现了自定义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实现的目的是转发错误响应。 我的问题是,如果响应状态为404,则ErrorResource error为空。

如果我将返回的响应状态更改为400,例如错误资源包含响应。

当通过浏览器直接请求消费服务时,我可以看到响应状态为404的响应主体。

当服务返回404时,为什么假设请求的响应主体为空? 有没有办法获得响应机构?

我刚刚开始假装工作,所以如果我的问题不清楚,请告诉我,我会尽量澄清遗漏的内容。

提前致谢!

1 个答案:

答案 0 :(得分:0)

好的,我刚刚发现为什么回答是空的。这不是我的错误。

由于我使用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);
    }
  }
}

现在一切正常:)