2016-08-31 77 views
0

我想解組派生自一個公共基類的對象列表。 他們被定義爲:現在jaxb解組派生對象列表

public abstract class Par { 
    @XmlTransient 
    public String name; 

    @XmlAttribute(name="name") 
    public String getName() { 
    return name; 
    } 

    public void setName(String n) { 
    name = n; 
    } 
} 

@XmlRootElement(name="int") 
public class IntegerPar extends Par { 
    @XmlTransient 
    public int value; 

    @XmlAttribute(name="value") 
    public int getValue() { 
     return value; 
    } 

    public void setValue(int v) { 
     value = v; 
    } 
} 

@XmlRootElement(name="string") 
public class StringPar extends Par { ... } 

,如果我創建一個列表,並將其編組爲XML,它工作正常生產整齊

<root> 
    <int name="x" value="1"/> 
    <string name="s" value="hello"/> 
</root> 

,但如果我想解組相同的XML這個類

@XmlRootElement(name="root") 
public class ParamRequest { 
    @XmlAnyElement 
    public ArrayList<Par> params; 
} 

我得到以下(從日食調試拍攝)

myRequest.params [[int: null], [string: null]] 

任何幫助? 謝謝。

編輯:解組由新澤西

@POST @Path("/params") 
@Produces(MediaType.TEXT_PLAIN) 
@Consumes(MediaType.APPLICATION_XML) 
public String postParams(ParamRequest myRequest) { 
    myRequest... 
    ... 
} 
+0

這兩個屬性都是'transient' – Jens

+0

不應該使用setXxx()方法嗎? 無論如何,我嘗試刪除XmlTransient部分,仍然無法正常工作。此外,編組停止工作,因爲現在有兩個同名的屬性。 – SirePi

回答

0

使用@XmlSeeAlso做到讓知道JAXB約馬歇爾/解組在子類。

@XmlSeeAlso({IntegerPar.class,StringPar.class}) 
public abstract class Par { 
+0

仍然不起作用。 我不知道在這一點上它是否重要,但我使用澤西島的自動解組。 (增加了問題) – SirePi