Jaxb2反序列化XML时出现‘Expected elements are (none)’错误排查
问题描述
我拥有schema1.xsd和schema2.xsd两个Schema文件,其中schema1.xsd导入了schema2.xsd。通过xjc(pom.xml配置)成功生成com.package1和com.package2两个包。运行以下代码:
final Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); marshaller.setClassesToBeBound(RootElement.class); marshaller.setContextPaths("com.package1"); setMarshaller(marshaller); setUnmarshaller(marshaller);
时出现如下错误:
Caused by: javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.example.com/x/y", local:"root_element"). Expected elements are (none) at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:712) ~[jaxb-runtime-2.3.8.jar:2.3.8]
XML文件以<root_element>标签开头,生成的Java类带有@XmlRootElement(name = "root_element")注解,当前使用jaxb2-maven-plugin和spring-oxm,请问该错误产生的原因是什么?
错误原因分析
- 命名空间映射缺失:XML中的
<root_element>带有命名空间http://www.example.com/x/y,但生成的@XmlRootElement注解仅指定了name属性,未配置对应的namespace属性。JAXB会将带命名空间的XML元素与无命名空间的Java类视为不匹配,因此抛出“预期元素为空”的异常。 - 上下文路径配置不完整且冲突:
- 同时使用
setClassesToBeBound和setContextPaths属于冲突配置——前者指定仅加载特定类,后者指定扫描整个包下的JAXB类,同时设置会导致JAXB上下文加载逻辑混乱; - schema2.xsd生成的com.package2包未被包含在上下文路径中,而schema1依赖schema2,缺失该包会导致JAXB无法完整识别整个XML结构的命名空间与元素映射关系。
- 同时使用
- JAXB上下文初始化逻辑异常:当同时指定类和包路径时,JAXB可能未正确加载
RootElement类对应的命名空间配置,导致无法匹配XML中的带命名空间元素。
内容的提问来源于stack exchange,提问作者Alexandre Gomes
相关产品推荐
相关产品推荐

