Apache Camel中XML转Java对象遇JAXB异常求助
看起来你遇到的是JAXB绑定XML到Java对象时的典型问题——JAXB需要ObjectFactory.class或者jaxb.index文件来识别指定包下的可绑定类,你的项目要么没生成这些必要文件,要么配置没指向正确的位置。下面一步步帮你排查解决:
1. 生成对应的JAXB绑定类
首先,你需要从目标XML对应的Schema(XSD)生成JAXB兼容的Java类。如果没有现成的XSD,你可以先从目标XML生成Schema,再用xjc工具生成类,推荐用Maven插件自动完成这个流程:
在pom.xml中添加jaxb2-maven-plugin配置:
<build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>jaxb2-maven-plugin</artifactId> <version>2.5.0</version> <executions> <execution> <goals> <goal>xjc</goal> </goals> </execution> </executions> <configuration> <!-- 替换为你生成的XSD文件路径,若没有XSD可先从XML生成后放入src/main/resources --> <schemaFiles>kursliste_ws.xsd</schemaFiles> <!-- 指定生成类的包路径,必须和你配置的com.domain.subdomain.domain完全一致 --> <packageName>com.domain.subdomain.domain</packageName> <outputDirectory>${project.basedir}/src/main/java</outputDirectory> </configuration> </plugin> </plugins> </build>
执行mvn jaxb2:xjc,就能在指定包下生成包含ObjectFactory.class和jaxb.index的Java类了。
2. 检查Maven依赖是否齐全
确保pom.xml中包含JAXB核心依赖和Camel JAXB组件:
<dependencies> <!-- JAXB API与实现 --> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.3.3</version> <scope>runtime</scope> </dependency> <!-- Apache Camel JAXB组件 --> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-jaxb</artifactId> <version>你的Camel版本号</version> </dependency> <!-- Camel核心依赖(根据你的项目补充) --> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-core</artifactId> <version>你的Camel版本号</version> </dependency> </dependencies>
注意:所有Camel组件的版本号要保持一致,避免版本冲突。
3. 核对Camel配置中的JAXBDataFormat
确保你的camel-context.xml或Java路由代码里,JAXBDataFormat指定的包路径和生成类的包完全匹配:
- 若用XML配置:
<bean id="jaxbDataFormat" class="org.apache.camel.converter.jaxb.JaxbDataFormat"> <property name="contextPath" value="com.domain.subdomain.domain"/> </bean>
- 若用Java DSL(比如
CurrencyRoute.java):
JaxbDataFormat jaxb = new JaxbDataFormat(); jaxb.setContextPath("com.domain.subdomain.domain"); // 在路由中使用该DataFormat from("direct:fetchAndParseXml") .unmarshal(jaxb) .to("...");
4. 验证编译结果
执行mvn clean compile后,检查target/classes/com/domain/subdomain/domain目录下是否存在ObjectFactory.class和jaxb.index文件。如果没有,说明插件生成路径配置错误,需要调整jaxb2-maven-plugin的outputDirectory参数。
完成以上步骤后,再执行mvn clean compile camel:run,应该就能正常将XML转换为Java对象了。
内容的提问来源于stack exchange,提问作者Europa

