XML字符串转Java对象报错求助:NoSuchMethodError问题排查
XML转Java对象时出现NoSuchMethodError问题排查
问题场景
已有对应POJO类,使用Jackson XmlMapper实现XML到Java对象的转换,代码如下:
ObjectMapper xmlMapper = new XmlMapper(); Request value = xmlMapper.readValue(xmlContent, Request.class); System.out.println(xmlMapper.writeValueAsString(value));
错误信息
运行时抛出如下错误:
Exception in thread "main" java.lang.NoSuchMethodError: 'com.fasterxml.jackson.core.io.ContentReference com.fasterxml.jackson.dataformat.xml.XmlFactory._createContentReference(java.lang.Object)' at com.fasterxml.jackson.dataformat.xml.XmlFactory.createParser(XmlFactory.java:492) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3677) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3645) at com.clover.myspringbootapp.example.XmlToJsonObject.main(XmlToJsonObject.java:25)
待转换XML示例
<XMLRequest> <RequestAction>Modify</RequestAction> <MerchantDetail> <CloverID>10</CloverID> <MerchantNumber>111111</MerchantNumber> <Platform>N</Platform> <DBAName>Test_306</DBAName> <LegalName>Test_306</LegalName> <Address1>Fountain road</Address1> <City>Vista</City> <State>Boulder</State> <Zip>1518580</Zip> <Country>US</Country> <PhoneNumber>1234567890</PhoneNumber> <Email>test@gmail.com</Email> <Contact>Test_306</Contact> <Reseller>DevelopersUS</Reseller> <MCCCode>7394</MCCCode> <Currency>USD</Currency> <TAEncryptionType>0001</TAEncryptionType> <GroupID>10001</GroupID> <SupportPhone>1234567890</SupportPhone> <ABAAccountNumber>000000000000000</ABAAccountNumber> <DDAAccountNumber>***********3770</DDAAccountNumber> </MerchantDetail> <CardTypes> <CardType CardName = "MASTER"> <SENUMBER /> <AlphaID>1234</AlphaID> <ServiceType>F</ServiceType> </CardType> <CardType CardName = "VISA"> <SENUMBER /> <AlphaID /> <ServiceType /> </CardType> </CardTypes> </XMLRequest>
问题原因及解决方案
核心原因
该错误是Jackson核心组件与XML数据格式组件版本不兼容导致的:XmlFactory调用的_createContentReference方法在当前依赖的jackson-core包中不存在,说明jackson-core、jackson-databind、jackson-dataformat-xml三个核心包的版本不一致。
解决步骤
统一Jackson依赖版本
确保项目中jackson-core、jackson-databind、jackson-dataformat-xml的版本完全相同。例如在Maven中,可通过dependencyManagement统一管理版本:<dependencyManagement> <dependencies> <dependency> <groupId>com.fasterxml.jackson</groupId> <artifactId>jackson-bom</artifactId> <version>2.15.2</version> <!-- 选择稳定版本,如2.15.x或最新稳定版 --> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>排查依赖冲突
执行依赖分析命令(Maven:mvn dependency:tree,Gradle:./gradlew dependencies),检查是否有旧版本Jackson包被间接引入,若有则在对应依赖中排除冲突版本:<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> </exclusion> </exclusions> </dependency>确保XML解析依赖完整
jackson-dataformat-xml依赖woodstox-core作为XML解析器,需确保该依赖正常引入(Maven通常会自动传递引入,若缺失可手动添加):<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> </dependency> <dependency> <groupId>org.codehaus.woodstox</groupId> <artifactId>woodstox-core-asl</artifactId> </dependency>
POJO类配置注意事项
为保证XML与Java对象正确映射,POJO类需添加Jackson XML注解:
- 根类
Request添加@XmlRootElement(name = "XMLRequest") - 字段与XML节点对应添加
@XmlElement(name = "XXX") CardType类中的CardName是XML属性,需添加@XmlAttribute(name = "CardName")- 空节点(如
<SENUMBER />)需确保POJO字段允许为null(基本类型建议用包装类,如Integer代替int)
内容的提问来源于stack exchange,提问作者Sujata Kattimani
相关产品推荐
相关产品推荐

