簡體   English   中英

解組列表 <foo> 與JAXB / Jersey

[英]Unmarshalling List<foo> with JAXB/Jersey

我想編組/取消編組2種自定義類型。 並且類型1有一個列表。 編組按預期方式工作-我在列表中為每個type2元素看到了一個單獨的元素,但是當我嘗試對其進行編組時,這是行不通的。

工作流程

@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>foo@bar.com</userEmail>
    <workflowId>797</workflowId>
    <workflowName>test-name</workflowName>
</workflow>

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

問題在於這種方法:

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 {
   ...
}

欲獲得更多信息

暫無
暫無

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

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