news 2026/6/9 22:30:02

[Day8] Contract-AI 的 bugfix 之路,疑难杂症大揭秘:GLM、Feign 及文件传递问题全攻克

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[Day8] Contract-AI 的 bugfix 之路,疑难杂症大揭秘:GLM、Feign 及文件传递问题全攻克

后端技术实践:问题与解决方案

目录

  1. GLM接口链接文件获取问题
  2. Feign访问400问题排查与解决
  3. 接口文件传递问题及处理
  4. 总结与下期预告

GLM接口链接文件获取问题

在项目开发过程中,遇到了GLM接口无法获取链接文件的情况。尽管传递的格式正确,且链接本身在正常访问场景下可用,但无论是minio分享链接,还是其他形式的分享链接,模型均无法识别。

经过排查发现,并非文件本身存在问题,推测可能是链接被某种规则屏蔽。因为当把文件通过nginx反向代理到公网后,文件能够正常被访问。

阿里的百炼针对此类情况,提供了平台内部的oss存储供模型调用。然而,由于对接百炼调用成本对比原平台过高,最终并未采用此方案。

后来,采用了一种较为简单的上云解决方案:通过腾讯云赠送的OSS,然后使用腾讯云的OSS API开放一个有效期为一小时的链接给模型访问。这样既解决了安全性问题,也满足了存储需求。

在此过程中,为排查模型无法访问链接的原因耗费了好几天时间,但遗憾的是,最终也未明确具体原因。提工单没有得到有效解释,相关文档也无说明。若有大佬知晓原因,恳请在评论区留言或私信指点,不胜感激

Feign访问400问题排查与解决

一次访问400的排查

项目启动注册后,Feign访问各个接口均出现400错误。经过一个下午加半天的排查,最终将问题定位在配置类上(当时没有经验,实在是惭愧,现在写文章的时候回想起来,看到4开头的错误码就该想到是请求/配置本身的问题)。

通过在SynchronousMethodHandlertargetRequest设置断点,发现多个配置类重复设置了请求头。按照原本设计,不同的client应使用对应的configuration,但实际情况是这些配置类被重复使用,从而导致请求出现400错误。

问题核心

该问题的核心在于:Feign对客户端专属配置类的处理逻辑,和Spring全局的Bean管理机制是分开的。即便配置类没有被@Configuration(或@Component等)标记,Feign依然能通过特殊逻辑识别并使用其中的@Bean。具体原因如下:

1. Feign客户端的“专属上下文”机制

当在@FeignClient中通过configuration属性指定配置类(如DeepSeekConfiguration)时,Feign会为这个客户端创建一个独立的子上下文(Subcontext)。这个上下文专门用于管理当前客户端的配置,如拦截器、超时设置等,并不依赖Spring的全局容器。

这个“子上下文”具有以下作用:

  • 隔离配置:避免不同Feign客户端的配置相互干扰;
  • 专属加载:专门加载configuration属性指定的配置类中的Bean。

例如,想象一个小区有很多栋楼(不同的Feign客户端),每栋楼都有自己独立的水电管理系统(子上下文),互不干扰。

2. Feign如何识别配置类中的@Bean

即便配置类没有@Configuration注解,Feign依然能够解析其中的@Bean方法,原因如下:

  • Feign会通过SpringFeign的内部逻辑,显式扫描configuration指定的类;
  • 对于这些类中的@Bean方法,Feign会直接调用它们来创建实例,类似“手动实例化”,而非依赖Spring全局容器的自动扫描;
  • 这些通过@Bean创建的对象会被注册到当前Feign客户端的“子上下文”中,仅对该客户端可见。

打个比方,就好像在一个班级(Feign客户端)里,老师(Feign)专门挑选了几个同学(配置类)来完成特定任务(创建Bean),而不需要学校(Spring全局容器)统一安排。

3. 为什么不需要Spring全局管理这些Bean?
  • 若采用全局管理(加@Configuration),会导致Bean被注册到Spring主容器,所有Feign客户端都会共享这些Bean,这正是之前遇到的问题;
  • 而Feign客户端的“子上下文”仅需“临时”创建并使用这些Bean,用完后仅在当前客户端范围内生效。
4. 依赖注入(如@Value)为何依然有效?

在配置类中,@Value("${ai.strategy.deepseek.api - key:}")依然能获取配置,这是因为Feign的“子上下文”会委托Spring主容器解析依赖,如@Value@Autowired等。也就是说,配置类中的依赖,如配置项、其他Bean,会从主容器中获取,但配置类本身和其@Bean创建的对象不会被注册到主容器。

总结:核心区别
场景@Configuration不加@Configuration(仅在@FeignClient.configuration中指定)
Bean注册位置Spring主容器(全局可见)Feign客户端专属“子上下文”(仅当前客户端可见)
生效范围所有Feign客户端共享仅指定的Feign客户端使用
依赖解析主容器自动处理子上下文委托主容器处理依赖

简单来讲,Feign通过“专属子上下文”机制,绕开了Spring全局Bean的管理,专门为每个客户端加载配置类中的@Bean,既保证了配置的隔离性,又能正常使用Spring的依赖注入能力。这就是去掉@Configuration后,Feign依然能使用这些@Bean的核心原因。

最终的解决方法是去掉这些配置类的@Component,仅依靠Feign的configuration配置来注册这些bean在Feign的上下文中。

接口无法正常传递文件

最初,接口直接使用inputstream作为返回值,然而这一做法导致Feign需要转换器才能正常工作。经过调整,将返回值换成byte数组后,接口便能正常传递文件。

总结与下期预告

在本次项目实践中,遇到了GLM接口链接文件获取、Feign访问400以及接口文件传递等问题,并通过各种排查与分析,找到了相应的解决方案。

下期将探讨management模块。目前基础模块已基本搭建完成,接下来将着手搭建上层模块,如同搭建积木一般,逐步完善整个项目架构。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/7 11:22:13

吐血推荐8个AI论文平台,继续教育学生轻松搞定毕业论文!

吐血推荐8个AI论文平台,继续教育学生轻松搞定毕业论文! AI 工具如何助力论文写作,成为学生新宠 在继续教育领域,论文写作一直是许多学生的“硬骨头”。无论是本科、硕士还是博士阶段,论文的撰写不仅考验学术能力&#…

作者头像 李华
网站建设 2026/6/9 20:12:42

【计算机毕业设计案例】深度学习基于python深度学习的猫狗表情识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/6/9 17:37:44

基于java的SpringBoot/SSM+Vue+uniapp的校园心理咨询系统的详细设计和实现(源码+lw+部署文档+讲解等)

文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言 🌞博主介绍:✌全网粉丝15W,CSDN特邀作者、211毕业、高级全…

作者头像 李华
网站建设 2026/6/9 20:02:43

AI写论文哪家强?宏智树AI:毕业论文的“全科医生”式智能助手

——从选题到答辩,AI如何帮你打通论文“全流程”? 宏智树AI官网:http://www.hzsxueshu.com | 微信公众号:宏智树AI每到毕业季,总有人对着空白的文档发愁:选题像“无头苍蝇”,不知道什么方向“有…

作者头像 李华