当前位置: 首页 > news >正文

feign 调用返回值为void接口,抛出了异常也不报错问题处理

在开发阶段发现个问题,对于那些不存在返回值的方法而言,无论响应正常与否,还是出现异常情况,都能够得到妥善处理。然而,在@FeiginClient注解所标识的情况里,当方法的返回值为void时,即便对方的接口抛出了异常,客户端依旧会收到成功的信息反馈。经过排查后发现,在调用无返回值的方法时,Feign 的解码器并未执行。

通过调试来查看接口的调用栈情况,发现接口在执行的过程中,会经由一个名为AsyncResponseHandler的类进行处理,随后会执行一个用于判断是否为void类型的方法isVoidType,从表面来看,这与我们所碰到的问题存在关联。

进入AsyncResponseHandler,找到这个方法

@Experimental
class AsyncResponseHandler {
    void handleResponse(CompletableFuture<Object> resultFuture, String configKey, Response response, Type returnType, long elapsedTime) {
        if (response.status() >= 200 && response.status() < 300) {
            if (this.isVoidType(returnType)) {
                resultFuture.complete((Object)null);
            } else {
                result = this.decode(response, returnType);
                    shouldClose = this.closeAfterDecode;
                resultFuture.complete(result);
            }
        } 
}

在使用Feign客户端进行HTTP请求时,如果你遇到的问题是调用返回值为void的方法时不会报错,这通常是由于Feign的默认行为导致的。Feign是一个声明式的Web服务客户端,它使得编写Web服务客户端变得更加简单。在Feign中,当你定义一个接口方法返回类型为void时,Feign会默认使用void作为方法的返回值。这意味着,当你调用一个返回类型为void的方法时,Feign会尝试执行HTTP请求,并且在请求完成后不会返回任何值(即没有返回值)。

为什么返回值为void不会报错?

这是因为Feign在设计时考虑到了多种可能的场景。例如,某些HTTP请求可能仅仅是用来触发某些操作(如发送消息、修改状态等),而这些操作的成功与否可能仅仅通过HTTP状态码来体现(例如200 OK表示成功,400 Bad Request表示失败)。在这种情况下,返回类型为void是合适的,因为它不需要返回额外的数据来指示操作的结果。

如何确保操作成功?

虽然Feign不会因为返回类型为void而抛出错误,但你可以通过以下几种方式来确保操作的正确性:

  1. 检查HTTP响应状态码

    你可以通过捕获异常或者在调用方法后检查响应对象的状态码来确保请求成功。例如,你可以在调用方法后检查响应的HTTP状态码:

    Response response = feignClient.yourVoidMethod();

    if (response.status() == 200) {

    // 操作成功

    } else {

    // 处理错误

    }

  2. 使用@ResponseStatus注解

    使用的是Spring Cloud OpenFeign,你可以在接口方法上使用@ResponseStatus注解来指定期望的HTTP状态码。如果实际返回的状态码与期望的不符,Spring将抛出异常。

    @RequestMapping(method = RequestMethod.POST, value = "/yourEndpoint")

    @ResponseStatus(HttpStatus.OK)

    void yourVoidMethod();

  3. 自定义异常处理

    你可以通过实现ErrorDecoder来自定义错误处理逻辑,从而在接收到特定状态码时抛出自定义异常。

    @Bean

    public ErrorDecoder errorDecoder() {

    return new ErrorDecoder() {

    @Override

    public Exception decode(String methodKey, Response response) {

    if (response.status() >= 400) {

    return new FeignException(methodKey, response);

    }

    return null; // 不抛出异常,保持默认行为

    }

    };

    }

http://www.dtcms.com/a/121261.html

相关文章:

  • 【C++】模板进阶
  • 编程中,!! 双感叹号的理解
  • 华为数字芯片机考2025合集1已校正
  • ECMAScript 6 新特性(一)
  • 解锁基因密码之重测序(从测序到分析)
  • 快速幂fast_pow
  • [Redis]redis-windows下载安装与使用
  • AI模型多阶段调用进度追踪系统设计文档
  • spark运行架构
  • 神舟平板电脑怎么样?平板电脑能当电脑用吗?
  • DB2数据库专用python库--ibm_db
  • 计算机控制系统:HX1838红外遥控器解码
  • # 深度学习中的优化算法详解
  • 利用高阶函数实现AOP
  • 蓝桥杯第十五届C++B组省赛真题解析
  • Appium工作原理及环境的搭建(1)
  • 系统性能核心指标:QPS、TPS、RT、并发量详解
  • NVIDIA PhysX 和 Flow 现已完全开源
  • 《Sqoop 快速上手:安装 + 测试实战》
  • 绿电直供零碳园区:如何用清洁能源重塑企业竞争力?
  • 力扣刷题day1(java自用)
  • Cursor编程-从入门到精通__0409
  • Java常用工具算法-6--秘钥托管云服务AWS KMS
  • 西门子S7-1200PLC 工艺指令PID_Temp进行控温
  • spring mvc中不同服务调用类型(声明式(Feign)、基于模板(RestTemplate)、基于 SDK、消息队列、gRPC)对比详解
  • 【Proteus仿真】【32单片机-A008】MPX4115压力检测系统设计
  • Linux环境防火墙常用配置说明
  • UGUI源代码之Text—实现自定义的字间距属性
  • AutoModelForCausalLM 解析,因果模型
  • MyBatis中特殊符号处理总结