2015-05-13 262 views
3

我有一個將作爲根元素的對象(Department)。它有一個聚合對象(Employee),它有兩個專門化(Manager和FactoryWorker)。如果我將Employee設置爲其中一個專用對象,那麼只有Employee對象屬性被編組。我會很感激任何提示。JAXB編組子類繼承

例如

@XmlRootElement(name="department") 
class Department { 
    public Department() {} 
    private Employee employee; 
    public void setEmployee(final Employee val) { 
     this.employee = val; 
    } 
} 

class Employee { 
    private Long id; 
    public Employee() {} 
    //getters and setters 
} 

class Manager extends Employee { 
    public Manager() {} 
    private Integer numberOfProjects; 
    //getters and setters 
} 
class FactoryWorker extends Employee { 
    public FactoryWorker() {} 
    private Boolean worksNights; 
    //getters and setters 
} 

的代碼片段只顯示編組

Deparment department = new Department(); 
FactoryWorker factoryWorker = new FactoryWorker(); 
factoryWorker.setId(999); 
factoryWorker.setWorksNights(true); 

JAXBContext jaxBContext = JAXBContext.newInstance(Department.class); 
Marshaller jaxbMarshaller = jaxBContext.createMarshaller(); 
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
jaxbMarshaller.marshal(department, System.out); 

JAXB輸出:工廠工人的專業屬性不存在。只是父Employee中的值。

<department> 
    <employee> 
     <id>999</id> 
    </employee> 
</department> 
+0

有辦法在代碼中錯別字太多,你粘貼 –

+0

手寫代碼簡單地代表了一個簡單的父母/孩子結構與標準簡le getters和setter。無論如何,我已經更新了它。 – solarwind

回答

4

你需要做的是這樣的:

將輸出
@XmlRootElement(name="Department") 
class Department { 
    public Department() {} 
    @XmlElements({ 
     @XmlElement(name="Manager", type=Manager.class), 
     @XmlElement(name="FactoryWorker", type=FactoryWorker.class) 
    }) 
    private Employee employee; 
    public void setEmployee(Employee val) {this.employee = val;} 
} 

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Department> 
    <FactoryWorker> 
     <id>999</id> 
     <worksNights>true</worksNights> 
    </FactoryWorker> 
</Department> 

演示:

+0

感謝Guido。完善。 – solarwind

+0

歡迎你;只是爲了挑剔你的代碼,你可能希望在JAXBContext.newInstance()調用中添加子類作爲附加參數。我記得(不知道)我從註釋類生成模式時必須這樣做。 –

+0

謝謝答案我也面臨同樣的問題。 現在我需要unmarshal這個XML,但我geting異常像 com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException:1計數IllegalAnnotationExceptions 類有兩個同名「Person」的屬性 –