Apache Camel集成Spring启动报错 无法定位Camel命名空间处理器
问题描述
学习使用Apache Camel过程中,运行调试从互联网下载的示例项目时持续抛出无法自行排查的错误,问题已卡壳一周,需要明确出错原因与具体排查方向。
项目相关配置、代码与依赖
Spring Camel上下文配置
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> <camelContext id="camelContext" xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="file://${input.dir}?fileName=input-message.csv"/> <log message="Before SmooksComponent ${body}"/> <to uri="smooks://smooks-config.xml"/> <log message="After SmooksComponent ${body}"/> </route> </camelContext> </beans>
主启动类代码
private static final String camelConfig = "META-INF/spring/camel-context.xml"; public static void main(String... args) throws Exception { CamelContext camelContext = configureAndStartCamel(camelConfig); // 预留时间让Camel处理文件 Thread.sleep(3000); camelContext.stop(); printEndMessage(); }
Maven依赖配置
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-core</artifactId> <version>3.10.0</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency>
完整报错信息
Exception in thread "main" org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://camel.apache.org/schema/spring] Offending resource: class path resource [META-INF/spring/camel-context.xml] at org.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:72) at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:119) at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:111) at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.error(BeanDefinitionParserDelegate.java:281) at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1388) at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1371) at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:179) at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:149) at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:96) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:511) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:391) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:338) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:310) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:224) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:195) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:257) at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:128) at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:94) at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130) at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:671) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:553) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:144) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:85) at org.smooks.examples.camel.csv2xml.Main.configureAndStartCamel(Main.java:87) at org.smooks.examples.camel.csv2xml.Main.main(Main.java:64)
错误根因与修复方案
核心报错为无法找到http://camel.apache.org/schema/spring命名空间对应的Spring命名空间处理器,具体原因和修复步骤如下:
- 核心依赖缺失:当前仅引入
camel-core和spring-context,Spring识别<camelContext>自定义XML标签所需的camel-spring组件完全缺失,该组件负责提供Camel Spring命名空间的解析逻辑,缺包时Spring无法解析Camel相关配置标签直接抛出解析异常。另外路由中使用了Smooks组件,也需要补充对应camel-smooks依赖,否则修复当前问题后会继续报组件不存在的错误。 - 版本与配置不兼容:当前XML中写死的Spring Beans schema为2.0版本,属于十几年前的老旧版本,和3.10.0版本Camel依赖的高版本Spring完全不兼容;同时手动引入
spring-context时未指定版本,容易和Camel依赖的Spring版本产生冲突。 - 依赖损坏风险:如果补全依赖后仍报相同错误,大概率是本地Maven仓库中Camel相关jar包下载不完整,导致jar包内的
spring.handlers配置文件缺失。
具体修复操作:
- 调整Maven依赖,补充缺失的Camel Spring、Camel Smooks依赖,所有Camel组件版本统一为3.10.0,删除手动添加的无版本号
spring-context依赖,由camel-spring自动拉取兼容版本的Spring依赖避免冲突,参考配置如下:
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-core</artifactId> <version>3.10.0</version> </dependency> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-spring</artifactId> <version>3.10.0</version> </dependency> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-smooks</artifactId> <version>3.10.0</version> </dependency>
- 修正XML配置头的schema地址,移除写死的低版本spring-beans-2.0.xsd引用,改为无版本号的通用schema引用,让Spring自动匹配当前依赖版本对应的schema:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
- 若补全依赖、修正配置后仍报错,删除本地Maven仓库中
org/apache/camel路径下3.10.0版本的所有文件夹,重新拉取依赖即可。
内容的提问来源于stack exchange,提问作者Jason Mootoo
相关产品推荐
相关产品推荐

