如何让JAXB自动从app:ShortName而非element的name属性生成属性名?
问题描述
我使用jaxb-maven-plugin从一系列XSD文件生成Java类,现有如下XSD片段:
<xsd:element name="ObjectAddress" type="address:AddressType" nillable="true"> <xsd:annotation> <xsd:appinfo> <app:ShortName>address</app:ShortName> </xsd:appinfo> </xsd:annotation> </xsd:element>
默认情况下,JAXB会基于xsd:element的name属性生成Java类属性名(比如上述示例会生成objectAddress),但我希望所有包含app:ShortName标签的xsd:element,其对应的Java属性名自动取自app:ShortName的内容(比如示例中改为address)。
我知道可以通过bindings.xjb为单个元素手动配置绑定:
<jaxb:bindings schemaLocation="Object.xsd" node="//xsd:element[@name='ObjectAddress']"> <jaxb:property name="address" /> </jaxb:bindings>
但我不想为每个元素逐一手动添加绑定规则,想实现自动批量处理所有符合条件的元素,请问是否可行?
解决方案
可以实现自动批量绑定,无需逐个配置。你可以在bindings.xjb中使用XPath全局匹配结合动态取值的方式,对所有包含app:ShortName的xsd:element统一设置属性名。
完整的bindings.xjb配置示例:
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:app="你的app命名空间URI" <!-- 替换为XSD中app前缀对应的实际命名空间 --> version="2.1"> <!-- 全局绑定,匹配所有Schema中符合条件的xsd:element --> <jaxb:bindings node="//xsd:element[xsd:annotation/xsd:appinfo/app:ShortName]"> <jaxb:property name="{$app:ShortName}" /> </jaxb:bindings> </jaxb:bindings>
关键说明:
- 命名空间声明:必须在
bindings.xjb中声明XSD里app前缀对应的实际命名空间URI(比如你的XSD中可能有xmlns:app="http://example.com/custom-appinfo",这里要对应填上)。 - XPath匹配规则:
//xsd:element[xsd:annotation/xsd:appinfo/app:ShortName]会匹配所有包含app:ShortName子节点的xsd:element元素。 - 动态取值:
name="{$app:ShortName}"会自动提取当前xsd:element下app:ShortName标签的文本内容作为Java属性名。
这样配置后,jaxb-maven-plugin在生成Java类时,会自动为所有符合条件的元素应用app:ShortName指定的属性名,无需逐个手动配置绑定。
内容的提问来源于stack exchange,提问作者Alex Mierzwa
相关产品推荐
相关产品推荐

