升级EclipseLink MOXy后XSD生成元素顺序异常问题咨询
变更原因
在MOXy 2.7.13版本中,为修复Java 9+环境下反射获取字段/方法顺序不稳定的问题,EclipseLink团队调整了Schema生成的属性排序逻辑:将原本依赖类中字段/方法声明顺序的逻辑,改为按属性名称字母顺序生成XSD元素。这一变更旨在保证不同JVM环境下生成的XSD结构一致,但引发了与2.7.12及更早版本的兼容性差异。
相关文档
该变更对应EclipseLink 2.7.13版本的Bug修复(Bug 580247),相关说明可在EclipseLink官方Release Notes的Schema Generation模块中找到。核心是解决旧版本中因JVM实现差异导致的XSD元素顺序不一致问题,但引入了向后兼容性的副作用。
规避方法
1. 显式指定属性顺序(推荐)
使用JAXB标准注解@XmlType(propOrder = {"属性名1", "属性名2", ...}),在实体类上明确标注XSD元素的生成顺序。示例:
@XmlType(propOrder = {"id", "name", "age", "email"}) public class User { private Long id; private String name; private Integer age; private String email; // getter/setter方法 }
该方式不受MOXy版本影响,是最稳定的解决方案。
2. 自定义Schema生成逻辑
通过扩展MOXy的org.eclipse.persistence.jaxb.compiler.SchemaGenerator类,重写属性收集与排序的方法,恢复基于声明顺序的排序逻辑:
- 重写
buildTypeInfo方法,收集属性时保留字段/方法的声明顺序; - 使用有序集合(如
LinkedHashMap)存储属性,替代默认的无序排序逻辑。
3. 临时回退版本
若暂时无法适配新排序逻辑,可临时回退至org.eclipse.persistence:org.eclipse.persistence.moxy:2.7.12版本,但需注意旧版本存在JVM环境下顺序不稳定的问题。
复现验证
你的最小演示项目中,2.7.12版本生成的XSD严格遵循类中字段的声明顺序,而2.7.13版本则按字母顺序重新排列元素,两者的差异直观体现了本次变更的影响。
内容的提问来源于stack exchange,提问作者realsim

