Feign 获取异常

     项目采用springCloud,那么Feign就避免不了,更惨的是自己负责后台中台,老板需要后台的接口全部都来源于后台中台,于是后台中台就需要转接其他所有微服务的接口。而接口报错,客户端就需要捕捉到异常,并抛给前端。如果在开启熔断之后,这个异常会被消化,要拿到服务端异常,feign.hystrix.enable需要设置为false

编写feign异常拦截器,获取到feign所有异常,并抛出

public class UserErrorDecoder implements ErrorDecoder {

    private Logger log = LoggerFactory.getLogger(getClass());
    ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public Exception decode(String methodKey, Response response) {
        int status = response.status();
        log.info("status:" + status);
        ExceptionInfo ei = null;
        try {
            String body = Util.toString(response.body().asReader());
            ei = this.objectMapper.readValue(body.getBytes(StandardCharsets.UTF_8), ExceptionInfo.class);

            log.info("调用接口状态:{},{}", ei.getStatus(), ei.getDetail());
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (status != 200) {
            assert ei != null;
            throw  new ApiException("调用接口状态:" + ei.getStatus() + "," + ei.getDetail() + "");
        }
        return defaultErrorDecoder(methodKey, response);
    }

    private Exception defaultErrorDecoder(String methodKey, Response response) {
        return new ErrorDecoder.Default().decode(methodKey, response);
    }

    @Bean
    public ErrorDecoder errorDecoder() {
        return new UserErrorDecoder();
    }
}
public class ExceptionInfo {
    private String type;
    private String title;
    private Integer status;
    private String detail;
    private String path;
    private String message;
}

为 Feign 配置 ErrorDecoder

@Configuration
@EnableFeignClients(basePackages = "xyz.ttooc.bcia.backend")
@Import(FeignClientsConfiguration.class)
public class FeignConfiguration {

    @Bean
    public ErrorDecoder errorDecoder() {
        return new UserErrorDecoder();
    }
}

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值