Springboot捕获feign抛出的异常

简介: 本文探讨了在使用Springboot与Feign客户端时,如何有效捕获接口异常的问题。由于全局异常无法直接捕获Feign抛出的异常,文章提供了具体解决方案:通过定义自定义异常类`BusinessException`,结合`ErrorDecoder`对Feign请求异常进行处理,或在全局异常捕获中添加特定处理器。示例代码详细展示了配置与实现步骤,帮助开发者更好地应对Feign客户端的异常处理需求。

前言

使用Springboot时,使用feign客户端作为http请求工具时,当接口抛出异常信息时,使用全局异常是捕获不了异常的

feign异常全局捕获

定义一个异常类

scala

体验AI代码助手

代码解读

复制代码

@Getter
public class BusinessException extends RuntimeException {

    private String message;

    private int code;

    public BusinessException(String message, int code) {
        this.message = message;
        this.code = code;
    }

    public BusinessException(String message) {
        super(message);
        this.message = message;
    }



}

捕获feign请求异常

vbnet

体验AI代码助手

代码解读

复制代码

@Slf4j
@Configuration
public class FeignExceptionConfig {

    @Bean
    public ErrorDecoder feignError() {
        return (key, response) -> {
            if (response.status() != HttpStatus.OK.value()) {
                try {
                    String data = IOUtils.toString(response.body().asInputStream());
                    log.error("feign请求错误,返回值为:{{}}", data);
                    throw new BusinessException(data);
                } catch (BusinessException e) {
                    throw e;
                } catch (Exception e) {
                    log.error("异常信息为:", e);
                    throw new RuntimeException(e);
                }
            }

            // 其他异常交给Default去解码处理
            // 这里使用单例即可,Default不用每次都去new
            return new ErrorDecoder.Default().decode(key, response);
        };
    }

}

或者在全局异常捕获加上这个

less

体验AI代码助手

代码解读

复制代码

@ExceptionHandler(FeignException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public String handleFeignException(FeignException ex) {
    log.error("feign异常处理信息", ex);
    return ex.contentUTF8();
}

总结

feign客户端是一个强大的请求工具,但是异常处理有时候得额外处理


转载来源:https://juejin.cn/post/7494412556947210290

相关文章
|
23天前
|
人工智能 Java 测试技术
SpringBoot 测试实践:单元测试与集成测试
在 Spring Boot 测试中,@MockBean 用于创建完全模拟的 Bean,替代真实对象行为;而 @SpyBean 则用于部分模拟,保留未指定方法的真实实现。两者结合 Mockito 可灵活控制依赖行为,提升测试覆盖率。合理使用 @ContextConfiguration 和避免滥用 @SpringBootTest 可优化测试上下文加载速度,提高测试效率。
|
Java Go Nacos
解决`java.lang.NoClassDefFoundError`在Nacos和Spring Boot集成中的问题
解决`java.lang.NoClassDefFoundError`在Nacos和Spring Boot集成中的问题
803 0
|
小程序 前端开发 程序员
不得不说,这19个程序员兼职平台让我1年收入60w
关于程序员接私活,社会各界说法不一。
1524 1
|
负载均衡 前端开发 Java
Spring Cloud Feign(声明式服务调用)使用指南
Spring Cloud Feign(声明式服务调用)使用指南
4191 0
Spring Cloud Feign(声明式服务调用)使用指南
|
弹性计算 监控 安全
教你选择合适的阿里云服务器ECS配置,极致性价比
阿里云服务器配置选择方法包括云服务器类型、CPU内存、操作系统、公网带宽、系统盘存储、网络带宽选择、安全配置、监控等,阿里云百科分享阿里云服务器配置选择方法,选择适合自己的云服务器配置
|
XML Java API
SpringBoot3.x日志生产最佳实践原来是这样!
SpringBoot3.x日志生产最佳实践原来是这样!
426 0
|
1月前
|
搜索推荐 定位技术 API
校园导航系统解决方案:智慧校园精准指引,提升校园服务质量
本文面向学校、相关技术人员以及对校园导航系统感兴趣的读者,提供校园导航系统的核心技术与功能的解析,包括高精度定位、三维地图构建及 AR/VR 集成等,推动智慧校园建设。如需校园导航系统解决方案欢迎私信获取,如有项目合作及技术交流欢迎私信作者哦~
125 2
校园导航系统解决方案:智慧校园精准指引,提升校园服务质量
|
1月前
|
SQL 人工智能 Java
Mybatis 二级缓存简单示例
本文通过一个简单示例演示MyBatis二级缓存的使用。主要内容包括:引入Maven依赖、配置SpringBoot文件、创建数据库与初始化SQL、编写实体类与Mapper,以及测试缓存功能。示例中展示了如何通过MyBatis的`<cache>`标签启用二级缓存,并验证了第二次查询直接从缓存中获取数据的过程。总结指出,SpringBoot MyBatis默认开启二级缓存,更多高级用法可进一步探索。