2012-02-15 58 views
2

我想編組/解組2自定義類型。類型1有一個List。編組按預期工作 - 我看到列表中每個type2元素都有一個單獨的元素,但是當我嘗試解組時,這不起作用。反編組列表<foo>與JAXB /澤西島

工作流

@XmlRootElement 
public class Workflow { 

    private String userEmail; 
    private List<WorkflowStep> steps = new ArrayList<WorkflowStep>(5); 

    //required by jaxb 
    public Workflow() { 

    } 

    public void setSteps(List<WorkflowStep> steps) { 
     this.steps = steps; 
    } 

    public List<WorkflowStep> getSteps() { 
     //do a defensive copy 
     return new ArrayList<WorkflowStep>(steps); 
    } 

    public void setUserEmail(String email) { 
     userEmail = email; 
    } 

    public String getUserEmail() { 
     return userEmail; 
    } 

} 

WorkflowStep

@XmlRootElement 
public class WorkflowStep { 

    private int cpu = 1; 
    private int mem = 1000; 
    private Map<String, String> parameters = Collections.emptyMap(); 


    public WorkflowStep() { 

    } 

    public void setCpu(int numCores) { 
     cpu = numCores; 
    } 

    public int getCpu() { 
     return cpu; 
    } 

    public void setMem(int mb) { 
     mem = mb; 
    } 

    public int getMem() { 
     return mem; 
    } 

} 

下面是一個例子輸出,如果我從瀏覽器訪問Web服務:

<workflow> 
    <steps> 
     <cpu>1</cpu> 
     <inputId>237</inputId> 
     <mem>1000</mem> 
     <parameters/> 
     <status>NOT-YET-STARTED</status> 
     <stepId>1509</stepId> 
     <submoduleId>0</submoduleId> 
     <workflowId>797</workflowId> 
    </steps> 
    <steps> 
     <cpu>1</cpu> 
     <inputId>364</inputId> 
     <mem>1000</mem> 
     <parameters/> 
     <status>NOT-YET-STARTED</status> 
     <stepId>1510</stepId> 
     <submoduleId>3</submoduleId> 
     <workflowId>797</workflowId> 
    </steps> 

    <userEmail>[email protected]</userEmail> 
    <workflowId>797</workflowId> 
    <workflowName>test-name</workflowName> 
</workflow> 

WorkflowStep是編組/解組成功,但列表不能解組爲什麼?應用程序服務器和REST客戶端都不會收到任何錯誤或異常,客戶端只會忽略WorkflowSteps列表?從上面的示例輸出中,我期望每個元素都將被轉換爲WorkflowStep類型的對象,然後會自動添加到列表中?

回答

6

的問題是用這種方法:

public List<WorkflowStep> getSteps() { 
    //do a defensive copy 
    return new ArrayList<WorkflowStep>(steps); 
} 

你JAXB實現檢查是否已經有此方法的List,如果有它使用它。您要返回的List不是由您正在解組的對象持有,因此解組操作後List丟失。

選項#1 - 更改getSteps()方法

public List<WorkflowStep> getSteps() { 
    //don't do a defensive copy 
    return steps; 
} 

選項#2 - 使用字段訪問

你可以改變這個你指定JAXB應該使用字段訪問。

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Workflow { 
    ... 
} 

欲瞭解更多信息

+0

如何做到這一點? – LordDoskias 2012-02-15 11:45:39

+0

@LordDoskias - 我已經添加了指定字段訪問的其他信息。 – 2012-02-15 11:49:13

+1

刷新後看到它。豎起大拇指! – LordDoskias 2012-02-15 11:51:31