如何强制JAXB使用限制类型生成含精准字段类型的类?
JAXB生成类的类型精准化问题
给定XML Schema映射
<xs:complexType name="ParentNode"> <xs:sequence> <xs:element name="child" type="ChildNode"/> </xs:sequence> </xs:complexType> <xs:complexType name="ParentNodeRestriction"> <xs:complexContent> <xs:restriction base="ParentNode"> <xs:sequence> <xs:element name="child" type="ChildNodeRestriction"/> </xs:sequence> </xs:restriction> </xs:complexContent> </xs:complexType>
JAXB当前生成的类
public class ParentNode { protected ChildNode child; } public class ParentNodeRestriction extends ParentNode { } public class ChildNode { } public class ChildNodeRestriction extends ChildNode { }
需求说明
已知ParentNode仅被ParentNodeRestriction使用,能否在不修改上述Schema映射的前提下,强制JAXB(使用Maven的jaxb2-maven-plugin 2.2版本)生成如下类,让child字段使用最精准的类型?
public class ParentNodeRestriction { protected ChildNodeRestriction child; }
解答
不能直接通过jaxb2-maven-plugin 2.2版本的默认配置实现这个需求,原因如下:
- JAXB对
xs:restriction的默认处理逻辑是让受限类继承基类,而非生成独立类并替换字段类型。这是因为XML Schema的restriction语义是对基类型的约束,JAXB默认用继承来体现这种类型约束关系。 - 不修改Schema的前提下,没有内置配置参数或插件扩展能强制改变生成逻辑。若要实现目标类结构,必须调整Schema定义:
- 直接将
ParentNodeRestriction定义为独立的xs:complexType,不再基于ParentNode做restriction; - 或使用JAXB绑定自定义(
.xjb文件)手动指定类结构,但这本质属于修改映射规则,不符合“不修改映射”的前提。
- 直接将
内容的提问来源于stack exchange,提问作者Pierre Demeestere
相关产品推荐
相关产品推荐

