JAXB 继承和@XmlSeeAlso 问题
Issue with JAXB inheritance and @XmlSeeAlso
问题是将两个相似的 XML
映射到单个 class 结构:
xml1: <a1><b1 b1Value="xxxx1"/></a1>
xml2: <a2><b2 b2Value="xxxx2"/></a2>
由于遗留代码,我无法创建特殊的抽象公共 classes,所以我必须使用简单继承:
1) class A1
及其子class A2
:
@XmlRootElement(name = "a1")
@XmlSeeAlso(A2.class)
public class A1 {
protected B1 b;
@XmlElement(name = "b1")
public B1 getB() { return b; }
public void setB(B1 b) { this.b = b; }
}
@XmlRootElement(name = "a2")
public class A2 extends A1 {
@XmlElement(name = "b2")
@Override
public B1 getB() { return super.getB(); }
@Override
public void setB(B1 b) { super.setB(b); }
}
2) Class B1
及其子class B2
:
@XmlSeeAlso(B2.class)
public class B1 {
protected String value;
@XmlAttribute(name = "b1Value")
public String getValue() { return value; }
public void setValue(String value) { this.value = value; }
}
public class B2 extends B1 {
@XmlAttribute(name = "b2Value")
@Override
public String getValue() { return super.getValue(); }
@Override
public void setValue(String value) { super.setValue(value); }
}
尝试解析时出现问题 xml2
:
JAXBContext jc = JAXBContext.newInstance(A1.class);
Unmarshaller um = jc.createUnmarshaller();
A1 entity = (A1) um.unmarshal(new StringReader("<a2><b2 b2Value="xxxx2"/></a2>"));
在这种情况下 entity
对象成为 class A2
的实例 - 这是正确的。但是内部字段 b
包含 class B1
的实例,其内部 value
是 null
(见下图):
有什么想法吗?
问题在于子classes 中的setter 参数类型和getter 返回类型。
要解决,需要在A2
个getters和setters里面把B1
改成B2
。
所以在 A2
class 中它应该不是 void setB(B1 b) { super.setB(b); }
,而是 void setB(B2 b) { super.setB(b); }
,而不是 B1 getB() { return super.getB(); }
它应该是 B2 getB() { return (B2)super.getB(); }
.
问题是将两个相似的 XML
映射到单个 class 结构:
xml1: <a1><b1 b1Value="xxxx1"/></a1>
xml2: <a2><b2 b2Value="xxxx2"/></a2>
由于遗留代码,我无法创建特殊的抽象公共 classes,所以我必须使用简单继承:
1) class A1
及其子class A2
:
@XmlRootElement(name = "a1")
@XmlSeeAlso(A2.class)
public class A1 {
protected B1 b;
@XmlElement(name = "b1")
public B1 getB() { return b; }
public void setB(B1 b) { this.b = b; }
}
@XmlRootElement(name = "a2")
public class A2 extends A1 {
@XmlElement(name = "b2")
@Override
public B1 getB() { return super.getB(); }
@Override
public void setB(B1 b) { super.setB(b); }
}
2) Class B1
及其子class B2
:
@XmlSeeAlso(B2.class)
public class B1 {
protected String value;
@XmlAttribute(name = "b1Value")
public String getValue() { return value; }
public void setValue(String value) { this.value = value; }
}
public class B2 extends B1 {
@XmlAttribute(name = "b2Value")
@Override
public String getValue() { return super.getValue(); }
@Override
public void setValue(String value) { super.setValue(value); }
}
尝试解析时出现问题 xml2
:
JAXBContext jc = JAXBContext.newInstance(A1.class);
Unmarshaller um = jc.createUnmarshaller();
A1 entity = (A1) um.unmarshal(new StringReader("<a2><b2 b2Value="xxxx2"/></a2>"));
在这种情况下 entity
对象成为 class A2
的实例 - 这是正确的。但是内部字段 b
包含 class B1
的实例,其内部 value
是 null
(见下图):
有什么想法吗?
问题在于子classes 中的setter 参数类型和getter 返回类型。
要解决,需要在A2
个getters和setters里面把B1
改成B2
。
所以在 A2
class 中它应该不是 void setB(B1 b) { super.setB(b); }
,而是 void setB(B2 b) { super.setB(b); }
,而不是 B1 getB() { return super.getB(); }
它应该是 B2 getB() { return (B2)super.getB(); }
.