2015-11-11 39 views
0

的問題是映射表similiar XML s到單個類結構:問題與JAXB繼承和@XmlSeeAlso

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

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

由於遺留代碼,我不能創建因此我必須使用簡單的繼承:

1)class 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(見下圖):

enter image description here

任何想法?

回答

0

問題在於子類中的setters參數類型和返回類型的getter。

爲了解決這個問題,有必要將B1更改爲B2裏面的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(); }