Feign调用全局异常处理解决

微服务之间调用的异常应该如何处理 typescript复制代码@Slf4j@Bean/*** 重新实现feign的异常处理,捕捉restful接口返回的json格式的异常信息*/@Override//空属性处理//设置输入时忽略在JSON字符串中存在但Java对象实际没有的属性//禁止使用int代表enum的order来反序列化enumtry {log.info("异常返回结果:"+ JSON.toJSONString(json));// 业务异常包装成自定义异常类MyException。 阅读详情

异常信息形如:

TestService#addRecord(ParamVO) failed and no fallback available.;

对于failed and no fallback available.这种异常信息,是因为项目开启了熔断:

feign.hystrix.enabled: true
当调用服务时抛出了异常,却没有定义fallback方法,就会抛出上述异常。由此引出了第一个解决方式。

解决方案:

自定义Feign解析器:

import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import cn.cicoding.base.jsoncore.exception.BaseException;
import feign.Response;
import feign.Util;
import feign.codec.ErrorDecoder;
import org.springframework.context.annotation.Configuration;

import java.io.IOException;

@Configuration
public class FeignErrorDecoder implements ErrorDecoder {

    @Override
    public Exception decode(String methodKey, Response response) {
        try {
            // 这里直接拿到我们抛出的异常信息
            String message = Util.toString(response.body().asReader());
            try {
                JSONObject jsonObject = JSONObject.parseObject(message);
                return new BaseException(jsonObject.getString("resultMsg"), jsonObject.getInteger("resultCode"));
            } catch (JSONException e) {
                e.printStackTrace();
            }

        } catch (IOException ignored) {
        }
        return decode(methodKey, response);
    }
}

定义系统的异常类

public class BaseException extends RuntimeException {
    private int status ;
 
    public int getStatus() {
        return status;
    }
 
    public void setStatus(int status) {
        this.status = status;
    }
 
    public BaseException() {
    }
 
    public BaseException(String message, int status) {
        super(message);
        this.status = status;
    }
 
    public BaseException(String message) {
        super(message);
    }
 
    public BaseException(String message, Throwable cause) {
        super(message, cause);
    }
 
    public BaseException(Throwable cause) {
        super(cause);
    }
 
    public BaseException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

统一异常拦截转换对应的异常信息返回前端

public class ResultSet {

    /**
     * 返回的状态码
     */
    private Integer resultCode;

    /**
     * 返回的消息
     */
    private String resultMsg;

    /**
     * 返回的数据
     */
    private Object data;

    public ResultSet() {
    }

    public ResultSet(Integer resultCode, String resultMsg) {
        this.resultCode = resultCode;
        this.resultMsg = resultMsg;
    }

    public ResultSet(Integer resultCode, String resultMsg, Object data) {
        this.resultCode = resultCode;
        this.resultMsg = resultMsg;
        this.data = data;
    }

    public Integer getResultCode() {
        return resultCode;
    }

    public void setResultCode(Integer resultCode) {
        this.resultCode = resultCode;
    }

    public String getResultMsg() {
        return resultMsg;
    }

    public void setResultMsg(String resultMsg) {
        this.resultMsg = resultMsg;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}

全局异常类处理配置:

@ExceptionHandler(value = BaseException.class)
public ResultSet defaultErrorHandler(HttpServletRequest req, HttpServletResponse resp, BaseException e) {
    ResultSet resultSet = new ResultSet();

    if (e.getStatus() == 400) {
        resultSet.setResultCode(-1);
        resultSet.setResultMsg(e.getMessage());
        resultSet.setData(null);
        resp.setStatus(400);
    } else {
        resp.setStatus(500);
        if(logger.isErrorEnabled()){
            logger.error("系统异常,请联系系统开发人员进行处理", e);
        }
        resultSet.setResultCode(-1);
        resultSet.setResultMsg(e.getMessage());
        resultSet.setData(null);
    }

    return resultSet;
}

这样就能完成了feign接收异常处理的自定义异常信息!

【Spring Cloud】OpenFeign与全局异常处理 原理基于请求头传递错误消息,利用aop和全局异常拦截机制实现。 阅读详情

相关推荐

全局异常处理吞掉日志?@RestControllerAdvice兜底必须打印完整堆栈

在Java服务端开发中,异常日志是快速定位问题的关键线索。Spring Boot默认具备一套异常处理机制,然而一旦引入@RestControllerAdvice全局异常处理器,异常就会被提前“截胡”,不再触发容器底层的默认错误日志输出。如果兜底方法只返回统一错误结果而没有打印堆栈,控制台便会陷入沉默,异常被悄无声息地掩盖。理解DispatcherServlet的异常解析链路与HandlerExceptionResolver的工作原理,能帮你快速定位这类日志丢失问题。正确做法是在兜底异常方法中使用log.er

weixin_33585822的博客 287

Feign调用报错:failed and no fallback available /timed-out and no fallback

一、failed and no fallback available 造成这种情况的原因 1.服务不可用 2.并发过大造成 二、timed-out and no fallback 造成这种情况的原因 服务连接正常,读取返回数据异常 改进:设置参数,feign 和hystrix,和ribbon的关系 参数 feign: hystrix: enabled: true ...

有才而性缓,定属大才。有智而气和,斯为大智。 2万+

学习天机项目的笔记

修改本地的的host文件(配置小工具)如果直接输入域名就能访问,就是不用输入端口号的话,就需要配置nginx80是naginx的默认端口号监听即可(配置nginx.conf),一个server代表一个虚拟主机。

weixin_53693850的博客 1877

Feign调用报错:failed and no fallback available

timed-out and no fallback 这个错误基本是出现在Hystrix熔断器,熔断器的作用是判断该服务能不能通,如果通了就不管了,调用在指定时间内超时时,就会通过熔断器进行错误返回。 一般设置如下配置的其中一个即可: 1、把时间设长 这里设置5秒 hystrix.command.default.execution.isolation.thread.timeoutInMillisec...

Hello World 4万+

【SpringCloud】 Fegin跨服务异常统一处理

【SpringCloud】 Fegin跨服务异常统一处理。一个庞大的微服务生态,每个服务都是处理自己的业务互不干扰,随着业务的不断扩展,就会涉及到一些服务之间的数据传输、接口共用、各种类型异常过滤统一处理等场景。Feign在微服务框架使服务之间接口调用变得很简洁、简单,而不需要再编写Java Http调用其他微服务的接口。

qq_1801743621的博客 3480

多层下拉框_HLM多层线性模型|HLM2教程

01多层线性模型简介多层线性模型(Multilevel linear model),又称为多层分析、分层线性模型。其本质是线性模型的线性模型、回归的回归。本文主要介绍如何使用HLM6.08软件来构建两层线性模型。02案例简介水平1文件:样例数据HSB1.sav包括7185个案例和4个变量:MINORITY:种族(1=minority, 0=other)FEMALE:性别(1=femal...

weixin_35714534的博客 5619

微服务项目OpenFeign下全局异常处理器的正确使用方式,解决feign调用时全局异常处理器失效的问题

本文针对SpringCloud OpenFeign微服务架构中异常响应处理问题提出了解决方案。当微服务通过Feign调用时,若被调用方抛出异常并被全局异常处理器捕获返回ResponseEntity对象,调用方会出现数据转换异常。作者最初尝试通过ResponseInterceptor拦截方案但遭遇流数据读取限制,最终采用Decoder解码方案:自定义Decoder在解码时判断响应体是否包含异常信息(code/msg字段),若存在则抛出异常交由调用方全局异常处理器处理,否则正常解码。该方案已在SpringBoo

2501_94563153的博客 491

S32K314 EB配置MCAL全模块讲解【Autosar——1 MCU模块详解】持续更新中

FIRC(fast internal RC Oscillator) :高速内部时钟,固定48MHZ;SIRC(Slow Internal RC Oscillator):低速内部时钟,固定32KHZ;FXOSC(Fast Crystal Oscillator Digital Controller):高速外部晶振(8-40MHZ),根据原理图选型进行配置;SXOSC():外部低速外部时钟,固定输入32.768KHZ;PLL_PHIn_CLK:时钟倍频锁相环时钟范围(640-1280MHZ);

qq_40488886的博客 1779

Feign接口降级及全局异常处理条件下seata全局事务不回滚问题解决方案

1.问题描述 开启全局事务demo: /** * @Description: 同步数据 * @Param: [schemeSyncVo] * @return: com.vulcan.base.domain.R<java.lang.Boolean> * @Author: Lvlin.Lou * @Date: 2029/9/16 10:59 */ @GlobalTransactional @Transactional @Override public R<Boolean&gt

dixialieren的专栏 1552

告别复杂配置!用GuidosToolbox 3.0做MSPA景观格局分析,从安装到出图全记录

本文详细介绍了如何使用GuidosToolbox 3.0进行MSPA景观格局分析,从安装配置到出图全流程。涵盖环境准备、数据预处理、参数设置、结果解读及可视化技巧,帮助用户快速掌握这一生态安全评估工具。特别针对安装教程中的常见问题提供解决方案,提升分析效率。

weixin_29248313的博客 487

Scipy优化踩坑实录:trust-constr和SLSQP约束定义到底差在哪?

本文深入解析了Scipy优化模块中trust-constr和SLSQP两种方法在约束定义上的差异。通过对比面向对象的trust-constr和字典式定义的SLSQP,揭示了它们各自的优势与适用场景,帮助开发者在有约束优化问题中选择合适的算法,提升计算效率与准确性。

weixin_42573113的博客 269

SpringCloudFeign 全局异常处理

坑一:服务端使用全局拦截异常统一处理,客户端未能捕获到异常 服务端中,使用了全局拦截异常统一处理(@RestControllerAdvice),返回统一格式信息,导致feign客户端调用服务端时候,当服务端出现异常,客户端捕获不到异常,也未能进入熔断,降级 @Slf4j @RestControllerAdvice public class ExceptionHandle { @Excep...

qq_36174487的博客 6096

利用pyGAM实现广义可加模型(GAM)的实战指南

本文提供了利用pyGAM库实现广义可加模型(GAM)的完整实战指南。通过乳腺癌和房价预测案例,详细讲解了从环境配置、模型构建、核心可视化(部分依赖图)到参数调优(n_splines, lam)的每一步。重点展示了GAM如何平衡模型准确性与可解释性,帮助数据科学家在Python中高效应用这一强大工具。

weixin_29053383的博客 323

Cloud中feign异常无法传递的问题

重写feign 全局异常处理方法: 分析: 因为cloud内部抛出异常不进行处理,Feign获取spring默认包装异常结果如下: { "timestamp": "2017-12-27 15:01:53", "status": 500, "error": "Internal Server Error", "exception": "com.keruyun.loya...

hnhygkx的博客 5978

170、电机控制中的温升测试

本文以一次IGBT炸管事故为切入点,深入剖析电机控制中温升测试的实质:不仅是温度测量,更是对铜损、铁损、散热效率等热管理问题的系统验证。作者强调测试前热电偶布置、环境记录、预运行的重要性,提出实时监控电流谐波、绕组电阻、散热梯度等关键参数,并通过损耗分离与冷却系统实测,揭示真实热源。结合温升曲线异常分析与经验建议,强调留余量、仿真结合实测、关注瞬态工况等实践要点,警示温升测试是保障可靠性与安全性的核心环节。

2401_88858637的博客 47

YOLOv13安装教程 手把手教你融合空间注意力机制(SAB)的RAB卷积模块 自动“聚焦”重要的特征 map指标提升8.96,准确率提升3.56

本文提出了一种改进的YOLOv13目标检测模型,通过引入RAB(残差注意力模块)显著提升了检测性能。实验结果显示,添加RAB模块后,mAP指标提升了8.96,准确率提高了3.56%。文章详细介绍了RAB模块的实现方法:1)采用多级残差连接增强特征提取能力;2)结合空间注意力机制(SAB)自动聚焦关键区域;3)通过1×1卷积实现通道维度压缩与恢复。同时提供了完整的模型移植方案,包括配置文件修改、任务处理代码调整以及模块实现细节,为YOLO系列模型的性能优化提供了有效参考。

FJN110的博客 646

【OpenFeign】OpenFeign问题:java.lang.NoSuchMethodError: feign.Request.requestBody()Lfeign/Request$Body;

一、参考资料 1. 问题描述 21-11-23 11:33:22.941 ERROR [XNIO-1 task-1] c.e.rpc.http.GlobalExceptionHandler :115 - Servlet exception caught: Handler dispatch failed; nested exception is java.lang.NoSuchMethodError: feign.Request.requestBody()Lfeign/Request$Body; ..

后端研发工程师Marion的博客 1826

基于simulink的AI融合与深度学习控制的场景实例:基于强化学习的电动汽车能量管理策略优化仿真

本文介绍了基于强化学习的电动汽车能量管理策略优化仿真方法。通过Simulink构建包含驾驶循环输入、电池子系统、电机驱动系统和强化学习控制器的仿真模型,采用DQN等算法训练智能代理,设计奖励函数优化能量分配。详细说明了建模步骤和参数设置,包括环境定义、代理训练和性能评估指标。该方法能有效提升电动汽车的续航里程、电池寿命和能源利用效率,为智能能量管理系统设计提供参考。

xiaoheshang_123的博客 153

Feign踩坑记

Feign服务端返回的自定义异常客户端接收不到,需要客户端重写全局接收异常。多个Feign调用同一个微服务 要设置contextId。

weixin_39910040的博客 179

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SpringCloud+Feign微服务拆分最佳实践

本文介绍了基于SpringCloud的微服务项目搭建过程,主要技术栈包括JDK17、MySQL8.0、SpringBoot3.3.13、Mybatis-Plus3.5.7和Nacos3.0.2。项目采用多模块结构,包含emp-service(员工服务)、dept-service(部门服务)和common模块(公共实体和工具类)。通过Nacos实现服务注册发现,使用Feign进行服务间调用,并整合Redis实现缓存功能。

2301_79658778的博客 525

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

feign 【已解决】报错 org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.choose

org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.choose(Ljava/lang/String;Lorg/springframework/cloud/client/loadbalancer/Request;)Lorg/springframework/cloud/client/ServiceInstance;

想去很远地方 5112

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Seata分布式事务失效场景

2.被调用服务全局异常捕获了,在Feign结果解析器中对返回结果进行判断,然后抛出异常,注意:解析器中抛出的异常会继续被FallbackFactory的默认实现捕获,需要在Feign熔断降级中将异常继续往上抛出(如上图)。Tip:Feign调用出现异常时如果没写FallbackFactory,或在FallbackFactory中继续往上抛出,则程序会因为异常执行中断;如果写了FallbackFactory,没有往上抛出异常,程序会继续执行。

qq_37128815的博客 907

记录一下自己的第一个SpringCloud项目中遇到的bug

移除springboot的web依赖 spring-boot-starter-web,这样就能正常启动了(放心,gateway底层的webflux也可以启动springboot项目)出现这种异常的原因是因为 gateway 的web依赖和springboot的web依赖发生冲突,gateway的web依赖是 webflux ,而 springboot为 web。原因是:在配置文件中filters下的 name 空着,没有写,因为我只是留了个位置,准备添加过滤器的,但是没有加上去。

weixin_74545874的博客 502

ReqAndRespAndZuul的一些自己的见解,和超时异常的解方案

import com@Documented @Retention(RetentionPolicy . RUNTIME) // 指定注解保留到运行时 @Target(ElementType . METHOD) // 指定注解可以应用在方法上 public @interface AddPermitForMethod {

qq_53374893的博客 274

ValidX 在微服务架构中的验证策略

在微服务架构中,ValidX 通过分层验证策略应对接口爆炸、跨服务调用、多语言与版本兼容等挑战。从 API Gateway 的轻量预检,到 Controller 层注解驱动的 DTO 校验,再到 Service 层动态业务规则校验,实现统一、可复用、可演进的验证体系。结合声明式配置与链式 API,有效保障数据一致性与系统稳定性,提升开发效率与用户体验。

vipxieliang的博客 2753
上一篇: Centos 7上安裝FastDFS V6.0.3 集群
下一篇: 封装fastdfs快速集成 --- 基于springboot
小小冒险家2022
小小冒险家2022 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄14年 145粉丝 161原创
评论 15
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值