JAXB Unmarshaller反序列化仅XmlAttribute映射成功,XmlElement为空如何解决
解决方案
原因说明:XML规范中属性默认不继承父元素的默认命名空间,只有元素会继承,所以你的
@XmlAttribute可以正常匹配,但子元素因为属于http://lorem.ipsum.com/命名空间,和Java类中@XmlElement默认的空命名空间不匹配,因此返回null。
不需要逐个给字段加namespace属性,推荐以下最优方案:
方案1:新增包级命名空间配置(推荐)
在你的JAXB生成类所在的包路径下新建package-info.java文件,添加如下内容即可全局生效:
@XmlSchema( // 替换为你的实际命名空间 namespace = "http://lorem.ipsum.com/", // 配置包下所有XmlElement默认使用上面指定的命名空间 elementFormDefault = XmlNsForm.QUALIFIED ) package com.lorem.ipsum; // 替换为你的POJO类实际包路径 import javax.xml.bind.annotation.XmlNsForm; import javax.xml.bind.annotation.XmlSchema;
该方案符合JAXB规范,配置一次全包生效,不需要修改任何现有类的字段注解。
方案2:XJC生成时提前配置(适合还未生成POJO的场景)
如果你的POJO是通过XJC工具从XSD生成的,可以在生成时的绑定文件中直接配置命名空间和elementFormDefault,生成的代码会自动带上package-info.java,不需要后续手动修改。
临时应急方案
如果是临时调试不想修改代码配置,可以在反序列化前将XML字符串中的xmlns="http://lorem.ipsum.com/"声明删除,也能正常映射,但该方法不推荐生产环境使用。
内容的提问来源于stack exchange,提问作者tristobal
相关产品推荐
相关产品推荐

