我正在使用外部映射文件来定义我的对象的编组。我的测试应用程序(link@bottom)有这个class_model.png:3 个类Contact、Relation和Country,它们都实现了自己的接口IContact、IRelation和ICountry。这 3 个接口扩展了多个超级接口。这 3 个类是相关的:Contact类有一个IRelation成员,Relation类有一个ICountry成员。
为了避免错误“ JAXB 无法映射 java 接口,因为它有多个可映射的父接口”,我在我的映射文件中将 3 个接口超级键入到 java.lang.Object,正如 Blaise Doughan 在他的博客中所描述的那样。
我想在类Relation中隐藏Country的编组,所以我在Relation中为 country 成员添加了一个xml-transient元素。
<?xml version="1.0"?>
<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.eclipse.org/eclipselink/xsds/persistence/oxm http://www.eclipse.org/eclipselink/xsds/eclipselink_oxm_2_4.xsd"
package-name="com.foo.domain"
xml-mapping-metadata-complete="false" xml-accessor-type="PROPERTY">
<xml-schema element-form-default="QUALIFIED" />
<java-types>
<java-type name="Contact">
<xml-root-element />
<java-attributes>
<xml-element java-attribute="relation"
type="com.foo.domain.Relation" />
</java-attributes>
</java-type>
<java-type name="Relation">
<xml-root-element />
<java-attributes>
<xml-transient java-attribute="country" />
</java-attributes>
</java-type>
<!-- ###### I want to delete this line ###### -->
<!-- <java-type name="ICountry" super-type="java.lang.Object" /> -->
<java-type name="IRelation" super-type="java.lang.Object" />
<java-type name="IContact" super-type="java.lang.Object" />
</java-types>
由于xml-transient ,该国家没有编组。所以我猜 MOXy 不处理Country,所以我不再需要ICountry的超类型。当我从映射中删除ICountry *super-type* 时,我收到错误消息“Java 接口 ICountry 无法由 JAXB 映射,因为它有多个可映射的父接口。” 再次在创建 JAXBContext 的过程中。
为什么在MOXy 由于xml-transient未处理Country对象时出现此错误?
我有一个大型域模型/对象树(300 个域,80 个包),其中每个域都实现了一个具有多个超级接口的接口。我预计我可以通过使用xml-transient元素来编组对象树的子集。但似乎 MOXy 需要为对象树中的每个接口提供一个超类型,即使该接口是由未编组的类实现的。因为 OXM 映射是基于包的,这意味着我必须为所有接口包含 80 个映射文件才能创建有效的 JAXBContext。
应该如何定义我的映射文件,以便 MOXy 不检查任何从编组过程中排除的接口/类?我如何编组一个巨大的对象树的子集,而不需要每个接口都被超级类型化?
非常感谢任何帮助。
包含更多信息的链接: 链接到test_app.zip,它演示了具有不同映射文件的多个单元测试中的行为。