Moxy使用@XmlPath(".")分组XML属性时反序列化数据异常问题
问题原因
你遇到的是EclipseLink MOXy组件@XmlPath(".")注解处理递归嵌套结构时的已知缺陷:序列化阶段可以正确把Attributes类的属性合并到当前Element节点输出,但反序列化阶段的XPath匹配逻辑没有做节点作用域隔离,会错误将后代节点的属性值匹配到上层节点的Attributes实例上,最终出现属性错位、层级重复的问题。
可行解决方案
方案1:标准JAXB属性委托方案(无框架依赖,兼容性最优)
不使用MOXy专有注解,通过属性转发的方式实现逻辑分层,同时完全兼容序列化、反序列化逻辑:
// 独立属性类,仅封装属性定义和相关基础逻辑 class Attributes { private String name; private String bounds; // 其余属性、getter、setter } class Element { private Attributes attributes = new Attributes(); // Element层仅添加JAXB注解,读写逻辑转发到内部attributes实例 @XmlAttribute public String getName() { return attributes.getName(); } public void setName(String name) { attributes.setName(name); } @XmlAttribute public String getBounds() { return attributes.getBounds(); } public void setBounds(String bounds) { attributes.setBounds(bounds); } @XmlElement(name = "element") List<Element> children; // 其余自有业务方法 }
这种方式既实现了属性定义和Element业务方法的解耦,又完全遵循标准JAXB规范,不会出现版本兼容问题。
方案2:修复MOXy @XmlPath 配置
如果一定要保留@XmlPath(".")的写法,需要调整注解配置强制MOXy识别节点作用域:
import jakarta.xml.bind.annotation.XmlAccessorType; import jakarta.xml.bind.annotation.XmlAccessType; import org.eclipse.persistence.oxm.annotations.XmlPath; @XmlAccessorType(XmlAccessType.FIELD) class Element { @XmlPath(".") private Attributes attributes; @XmlElement(name = "element") List<Element> children; // 其余自有业务方法 } // Attributes类显式指定字段访问策略 @XmlAccessorType(XmlAccessType.FIELD) class Attributes { @XmlAttribute private String name; @XmlAttribute private String bounds; // 其余属性 }
注意该方案仅在MOXy 2.7.0及以上版本生效,如果使用低版本MOXy还是推荐使用方案1。
内容的提问来源于stack exchange,提问作者AweSIM
相关产品推荐
相关产品推荐

