我正面临一个编组/解组问题,涉及使用 MOXy 的 JAXB 实现和外部元数据绑定文件的继承和多态性。
我无法控制 XML 文件或模型类。
模型内部有多个类继承其他 DTO 类。这是我正在使用的环境的示例。此示例仅用于某些语法目的,真实环境涉及嵌套继承、集合等:
这是将被继承的类
class A {
private String name;
public String getName(){
return name;
}
public void setName(String value){
name = value;
}
}
这是一个继承的类
class B extends A {
private String attrFromB;
public String getAttrFromB(){
return attrFromB;
}
public void setAttrFromB(String value){
attrFromB = value;
}
}
还有一个
class C extends A {
private String attrFromC;
public String getAttrFromC(){
return attrFromC;
}
public void setAttrFromC(String value){
attrFromC= value;
}
}
这是一个容器类
class MyContainerClass{
private A myObject;
public A getMyObject(){
return myObject;
}
public void setMyObject(A value){
myObject = value;
}
}
这是在 MyContainer 包含 A 的情况下它应该生成的 XML
<MyContainer>
<MyObject nameA="foo" />
</MyContainer>
MyContainer 包含 B
<MyContainer>
<MyObject nameB="foo" attrFromB="bar" />
</MyContainer>
和包含 C 的 MyContainer
<MyContainer>
<MyObject nameC="foo" attrFromC="bar" />
</MyContainer>
所以你已经可以看到即将出现的问题......
这是我要编写的映射文件:
<?xml version="1.0"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="com.test.example"
version="2.1">
<java-type name="A" xml-accessor-type="NONE">
<xml-root-element name="MyObject" />
<java-attributes>
<xml-element java-attribute="name" xml-path="@nameA" />
</java-attributes>
</java-type>
<java-type name="B" xml-accessor-type="NONE">
<xml-root-element name="MyObject" />
<xml-see-also>
com.test.example.A
</xml.see.also>
<java-attributes>
<xml-element java-attribute="name" xml-path="@nameB" />
<xml-element java-attribute="attrFromB" xml-path="@attrFromB" />
</java-attributes>
</java-type>
<java-type name="C" xml-accessor-type="NONE">
<xml-root-element name="MyObject" />
<xml-see-also>
com.test.example.A
</xml.see.also>
<java-attributes>
<xml-element java-attribute="name" xml-path="@nameC" />
<xml-element java-attribute="attrFromC" xml-path="@attrFromC" />
</java-attributes>
</java-type>
<java-type name="MyContainer" xml-accessor-type="NONE">
<xml-root-element name="MyContainer" />
<java-attributes>
<xml-element java-attribute="myObject" type="com.test.example.A" xml-path="MyObject" />
</java-attributes>
</java-type>
</xml-bindings>
第一个问题是,如果我像这样绑定类,我会得到以下异常:
[Exception [EclipseLink-44] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Missing class indicator field from database row [UnmarshalRecord()].
第一个问题:我知道这是正常的,Jaxb 需要一些方法来确定 MyContaioner.myObject 属性的类型。问题是我无法访问传入的 XML 文件,因此我无法向它们添加 xsi:type 字段。有没有办法根据其中是否存在特定属性来确定一个类?不管它的价值。如果源 xml 包含 @attrFromC 属性,我知道对象应该是 C 类型。如果它包含 attrFromB,它就是 B。
第二个问题是“name”属性在 B 和 C 中不存在,所以 jaxb 忽略了 em。
--Ignoring attribute [name] on class [com.test.example.B] as no Property was generated for it.
--Ignoring attribute [name] on class [com.test.example.C] as no Property was generated for it.
第二个问题:另一个问题是我不知道 Jaxb 是否能够像 XML 文件中预期的那样覆盖 xml 属性名称(@nameA、@nameB 和 nameC 都指 A.name),有没有办法做它 ?
在此先感谢您的时间。