升级Spring Boot与Camel版本修复漏洞时遇CamelContext Bean注入错误
问题分析与解决方案
核心原因
Spring Boot 3.0.x 基于 Jakarta EE API,而你使用的 Camel 3.17.0 仍依赖旧的 Java EE(javax)API,两者依赖体系不兼容,导致 Spring 容器无法正确识别并注入 CamelContext 实例。另外,Camel 3.x 系列本身不支持 Spring Boot 3,官方适配 Spring Boot 3 的是 Camel 4.x 及以上版本。
解决方案
方案一:升级 Camel 到适配 Spring Boot 3 的版本
这是长期兼容的最优方案:
- 将所有 Camel 相关依赖(包括
camel-core、camel-spring-boot-starter、camel-cxf)统一升级到 Camel 4.0.0+(推荐 4.0.2 或更高稳定版)。 - 执行
mvn dependency:tree检查依赖树,排除所有遗留的 javax 相关依赖,确保项目完全基于 Jakarta EE API。 - 若代码中存在引用 javax 包的代码(如
javax.ws.rs、javax.annotation),替换为对应的 jakarta 包(jakarta.ws.rs、jakarta.annotation)。
方案二:降级 Spring Boot 到与 Camel 3.17.0 兼容的版本
如果暂时不想升级 Camel,可以选择此折中方案,同时也能修复 CVE-2023-20860:
- 将 Spring Boot 版本降级到 2.7.10(该版本已修复 CVE-2023-20860,且与 Camel 3.17.0 完全兼容)。
- 保持 Camel 3.17.0、snakeyaml 2.0 等依赖版本不变,无需额外调整代码。
代码层面的注入优化(可选)
无论选择哪种方案,若 @Autowired 注入仍有问题,可以尝试:
- 实现
CamelContextAware接口,Camel 会自动将上下文注入到实现类中:
public class SetTokenInHeaderProcessor implements Processor, CamelContextAware { private CamelContext ctx; @Override public void process(Exchange exchange) throws Exception { // 使用 ctx 处理逻辑 } @Override public void setCamelContext(CamelContext camelContext) { this.ctx = camelContext; } @Override public CamelContext getCamelContext() { return ctx; } }
- 或者使用
@Inject替代@Autowired,部分场景下能解决注入识别问题。
内容的提问来源于stack exchange,提问作者bhaskar guguloth
相关产品推荐
相关产品推荐

