簡體   English   中英

JAXB繼承和@XmlSeeAlso問題

[英]Issue with JAXB inheritance and @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實例,並且其內部value null (請參見下圖):

在此處輸入圖片說明

有任何想法嗎?

問題在於子類中的setters參數類型,而getters返回類型。

為了解決這個問題,必須在A2吸氣劑和設定器中將B1更改為B2

因此,在A2類中,它不應void setB(B1 b) { super.setB(b); } void setB(B1 b) { super.setB(b); } ,但void setB(B2 b) { super.setB(b); } void setB(B2 b) { super.setB(b); } ,而不是B1 getB() { return super.getB(); } B1 getB() { return super.getB(); }應該是B2 getB() { return (B2)super.getB(); } B2 getB() { return (B2)super.getB(); }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM