您可以通过MOXy 实现此目的。
除了标准的 JAXB 注释之外,EclipseLink 还提供了另一个
表达元数据的方式:EclipseLink XML 绑定
文档。 XML 绑定不仅可以分离您的映射信息
从您实际的 Java 类中,它也可以用于更高级的
元数据任务,例如:
- 使用其他映射信息扩充或覆盖现有注释
- 在外部指定所有映射信息,在 Java 中完全没有注释
- 定义跨多个绑定文档的映射指定不对应于具体 Java 字段的“虚拟”映射和
更多。
我曾经在Annox 中为 JAXB RI 编写过类似的实现,请看here。在这两种情况下,想法都是将映射放在 XML 文件中而不是注释中。我不知道 MOXy 是怎么做到的。 Annox 提供了一个“注释阅读器”,它读取 XML 资源而不是注释。下面是典型的purchase order 示例:
final AnnotationReader<Type, Class, Field, Method> annotationReader = new AnnoxAnnotationReader();
final Map<String, Object> properties = new HashMap<String, Object>();
properties.put(JAXBRIContext.ANNOTATION_READER, annotationReader);
final JAXBContext context = JAXBContext.newInstance(
"org.jvnet.annox.samples.po",
Thread.currentThread().getContextClassLoader(),
properties);
final Object myObject = context.createUnmarshaller().unmarshal( ... );
classpath:org/jvnet/annox/samples/po/package-info.ann.xml.
<package xmlns="http://annox.dev.java.net" xmlns:annox="http://annox.dev.java.net" xmlns:jaxb="http://annox.dev.java.net/javax.xml.bind.annotation"
xmlns:adap="http://annox.dev.java.net/javax.xml.bind.annotation.adapters">
<adap:XmlJavaTypeAdapters>
<adap:XmlJavaTypeAdapter value="org.jvnet.annox.samples.po.BigDecimalAdapter" type="java.math.BigDecimal" />
</adap:XmlJavaTypeAdapters>
<class name="ObjectFactory">
<jaxb:XmlRegistry />
<method name="createPurchaseOrder">
<jaxb:XmlElementDecl namespace="" name="purchaseOrder" />
</method>
<method name="createComment">
<jaxb:XmlElementDecl namespace="" name="comment" />
</method>
</class>
<class name="PurchaseOrderType">
<jaxb:XmlAccessorType value="FIELD" />
<jaxb:XmlType name="PurchaseOrderType" propOrder="shipTo billTo comment items" />
<field name="shipTo">
<jaxb:XmlElement required="true" />
</field>
<field name="billTo">
<jaxb:XmlElement required="true" />
</field>
<field name="items">
<jaxb:XmlElement required="true" />
</field>
<field name="orderDate">
<jaxb:XmlAttribute />
<jaxb:XmlSchemaType name="date" />
</field>
</class>
<class name="Items">
<jaxb:XmlAccessorType value="FIELD" />
<jaxb:XmlType name="Items" propOrder="item" />
</class>
</package>
classpath:org/jvnet/annox/samples/po/Items$Item.ann.xml:
<class xmlns="http://annox.dev.java.net" xmlns:annox="http://annox.dev.java.net" xmlns:jaxb="http://annox.dev.java.net/javax.xml.bind.annotation">
<jaxb:XmlAccessorType value="FIELD"/>
<jaxb:XmlType name="" propOrder="productName quantity usPrice comment shipDate"/>
<field name="productName">
<jaxb:XmlElement required="true"/>
</field>
<field name="usPrice">
<jaxb:XmlElement name="USPrice" required="true"/>
</field>
<field name="shipDate">
<jaxb:XmlSchemaType name="date"/>
</field>
<field name="partNum">
<jaxb:XmlAttribute required="true"/>
</field>
</class>
如果您可以使用 MOXy,我建议您使用 MOXy,因为它绝对是主流。
免责声明:我是 Annox 的作者,它恰好是适合这种情况的工具。