惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The GitHub Blog
The GitHub Blog
Martin Fowler
Martin Fowler
Vercel News
Vercel News
U
Unit 42
Engineering at Meta
Engineering at Meta
aimingoo的专栏
aimingoo的专栏
MyScale Blog
MyScale Blog
Y
Y Combinator Blog
阮一峰的网络日志
阮一峰的网络日志
爱范儿
爱范儿
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
B
Blog RSS Feed
N
Netflix TechBlog - Medium
GbyAI
GbyAI
F
Fortinet All Blogs
MongoDB | Blog
MongoDB | Blog
大猫的无限游戏
大猫的无限游戏
C
Check Point Blog
M
MIT News - Artificial intelligence
D
Docker
IT之家
IT之家
Stack Overflow Blog
Stack Overflow Blog

博客园 - 五岳

JDK中使用的设计模式 Java的List.sort()排序方法源码理解 Cloud Agent 开发笔记(4):Skill 与 MCP 集成、项目后记 Cloud Agent 开发笔记(3):Web 交互与数据持久化 Cloud Agent 开发笔记(2):Agent 引擎与 Tool 体系 Cloud Agent 开发笔记(1):V1从跑通到放弃 单点登录系统思维导图与资料收集 阿里云DTS按业务场景批量迁移RDS MySQL表实战(下):迁移管理平台设计与实现 阿里云DTS按业务场景批量迁移RDS MySQL表实战(上):技术选型和API对接 分库分表数据源ShardingSphereDataSource的Connection元数据误用问题分析 Web层接口通用鉴权注解实践(基于JDK8) 解决Dify的Ollama插件添加模型时保存成功但模型为空的问题 深入研究使用DozerMapper复制List<Ojbect>前后元素类型不一致的问题 mybatis-config的mapUnderscoreToCamelCase配置生效方式和基本原理 封装CompletionService的并发任务分发器(优化版) 深入理解Mybatis分库分表执行原理 写代码被大语言模型坑之使用LocalDateTime比较两个时间差了几天 系统设计:消灭慢接口 使用LinkedList实现队列和栈 Collectors.toMap的暗坑与避免方式 如丝般顺滑:DDD再实践之类目树管理 阿里云数仓Dataworks数据导出到文件step by step DDD实践反思 LeetCode组合总和I~IV和背包问题小结 Akka学习笔记
Feign框架中一处编码不合理导致的异常
五岳 · 2025-07-30 · via 博客园 - 五岳

简述一下背景。线上的应用A导出文件失败,但是对应的任务状态没有设置。经过代码的梳理,大致流程为:

  1. 创建导出任务
  2. 执行异步任务:
    2.1 文件下载、打包
    2.2 调用应用B的Feign接口上传文件
  3. 更新异步任务状态

在执行2.2这一步时,调用Feign接口内部抛了一个异常:
image

对应代码是:
image

照理说,这样导出任务会置为失败:
image

但是,由于EncodeException的message是null,导致substring()方法调用时抛了个NPE,设置任务状态的代码不会执行。

Exception的message,是允许为null的,但是在Feign的EncodeException代码里却是这样:

public class EncodeException extends FeignException {

  private static final long serialVersionUID = 1L;

  /**
   * @param message the reason for the failure.
   */
  public EncodeException(String message) {
    super(checkNotNull(message, "message"));
  }

  /**
   * @param message possibly null reason for the failure.
   * @param cause   the cause of the error.
   */
  public EncodeException(String message, Throwable cause) {
    super(message, checkNotNull(cause, "cause"));
  }
}

所以这里就很奇怪,在第一个构造器里,message不能为null,但在第二个构造器里,又允许为null。那么对于依赖EncodeException中message内容的代码,仍然要对null做处理,既然如此,为什么第一个构造器允许message为空又何妨?

另一种保持行为一致的方式,可以给第二个构造器加一个默认的message,仅当传入值非空时才使用传入值。

对于这个问题,由于我对Feign整体的了解有限,没有提Pull request而是提了一个issue:Why EncodeException's message is not nullable in 1st constructor but nullable in 2nd constructor?。文中应用A使用io.github.openfeign的是9.5.1,而对于github上主干分支,仍然有类似问题。