java - Netflix Feign : Response Body empty in ErrorDecoder on 404

标签 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 为 null。

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

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

为什么服务返回404时Feign请求的响应体为空? 有没有办法获取响应体?

我刚开始使用 feign,所以如果我的问题不清楚,请告诉我,我会尽量澄清遗漏的内容。

提前致谢!

最佳答案

好吧,我刚刚发现为什么响应是空的。这不是装错,这是我的错。

由于我使用 JacksonDecoder,如果由于 JacksonDecoder 中的以下代码,响应状态为 404,我总是得到空响应。

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

现在一切正常:)

关于java - Netflix Feign : Response Body empty in ErrorDecoder on 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37089475/

相关文章:

java - 异常: Inconsistent java and sql object types

java - 使用 springframework 验证错误验证枚举

spring - 使用 STS 创建新的 Web 应用程序项目时找不到 Spring MVC 项目?

java - 如何使用 spring 添加多个谷歌云数据源

java - Netflix 假装异常

java - 带有微服务的 Spring REST 应用程序

java - 如何从 sqlite 获取数据,并使用 stackwidget 显示它?

java - 如何复制多模块项目的依赖项?

docker - “org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean”使用docker

java - YouTube Java API 问题