我实现了一个自定义的 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/