[英]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.