JAXB继承和@XmlSeeAlso的问题

安德鲁莫尼

问题是将两个类似XML的对象映射到单个类结构:

xml1: <a1><b1 b1Value="xxxx1"/></a1>

xml2: <a2><b2 b2Value="xxxx2"/></a2>

由于遗留代码,我无法创建特殊的抽象公共类,因此我必须使用简单的继承:

1)类A1及其子类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)类B1及其子类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对象成为类的实例A2-是正确的。但是内部字段b包含类的实例,B1其内部valuenull(参见下图):

在此处输入图片说明

有任何想法吗?

安德鲁莫尼

问题在于子类中的setters参数类型,而getters返回类型。

要解决此问题,必须更改B1B2内部A2吸气剂和吸气剂。

所以在A2课堂上应该不是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(); }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章