贝利信息

XML Schema的继承和扩展如何影响映射

日期:2026-01-14 00:00 / 作者:月夜之吻
XML Schema抽象类型(abstract="true")不生成可实例化Java类,JAXB需@XmlSeeAlso声明子类,MyBatis resultMap必须引用具体类型;substitutionGroup实现多态但依赖工具链显式支持。

XML Schema 继承如何影响 Java 类映射(如 JAXB / MyBatis)

XML Schema 的 abstract="true" 类型或元素本身不生成可实例化的 Java 类,但会显著改变映射工具的行为——JAXB 会跳过抽象类型生成接口或抽象类,MyBatis 的 XML 映射器则可能因找不到具体 type 而抛出 InvalidMappingException

扩展()与组合()对字段生成的差异

是安全的继承方式,它向父类型“追加”字段;而 是收缩约束,常用于枚举或长度限制,但它不会新增字段,反而可能让映射工具丢弃父类型中被限制掉的字段(尤其在老版本 JAXB 2.2 中)。

抽象元素 + substitutionGroup 在实际 XML 文档校验中的表现

抽象元素本身不能出现在 XML 实例中,但通过 substitutionGroup 指定的替代元素可以——这个机制是 Schema 层实现“多态”的关键,直接影响文档能否通过校验,也决定映射时是否能动态识别具体类型。



  
    
  

为什么 MyBatis 的 resultMap 继承和 XSD 继承不是一回事

MyBatis 的 extends 属性只是 XML 配置层面的文本复用,它不依赖、也不校验底层 XSD 是否定义了继承关系;XSD 的 是数据结构契约,对 XML 解析器强约束,但对 MyBatis 运行时零影响。

抽象类型和 substitutionGroup 的组合,是 Schema 层唯一接近 OO 多态的机制,但它的生效前提是整个工具链(校验器、绑定器、映射器)都明确支持并启用对应特性。多数人卡在 JAXB 缺少 @XmlSeeAlso 或 MyBatis 忘记 extends,而不是 Schema 写错了。