Feign 异常处理
在目前微服务流行的年代,稍微大点的项目都会使用微服务架构模式。
当服务提供方响应为非 2xx 状态码时, feign调用将会抛出FeignException. 由于其异常message经过了Feint的封装, 所以不再是服务提供方的原始异常信息. 若想展示原始信息则需要重写ErrorDecoder来实现。
重写ErrorDecoder
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public class FeignErrorDecoder implements ErrorDecoder {
@Override public Exception decode(String methodKey, Response response) {
String message = null; try { if (response.body() != null) { message = Util.toString(response.body().asReader(Util.UTF_8)); ApiResponse result = JsonUtil.parse(message, ApiResponse .class);
return new ServiceException(result.getMsg()); } } catch (Exception ignored) { } return new RuntimeException(message); } }
|
配置全局Feign配置类
1 2 3 4 5 6 7 8
| @Configuration public class CustomizedConfiguration {
@Bean public ErrorDecoder feignDecoder() { return new FeignErrorDecoder(); } }
|
说明:如果不加@Configuration,需要在@FeignClient指定配置类,在Feign进行远程调用后,需要对结果进行解码成具体的Java对象,如ApiResponse对象。