Lor*_*ias 2 java jaxb jersey unmarshalling
我想编组/解组2种自定义类型.类型1有一个List.编组按预期工作 - 我在列表中看到每个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;
}
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我从浏览器访问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>
Run Code Online (Sandbox Code Playgroud)
WorkflowStep已成功编组/解组,但列表无法解组,为什么会这样?客户端只是忽略了WorkflowSteps列表,应用服务器和REST客户端也没有收到任何错误或异常?从上面的示例输出中,我希望每个元素都会转换为WorkflowStep类型的对象,然后会自动添加到List中吗?
问题在于这种方法:
public List<WorkflowStep> getSteps() {
//do a defensive copy
return new ArrayList<WorkflowStep>(steps);
}
Run Code Online (Sandbox Code Playgroud)
您的JAXB实现检查是否已存在List此方法,以及是否使用它.将List要返回不是由你解组对象举行,所以解组操作后List会丢失.
选项#1 - 更改getSteps()方法
public List<WorkflowStep> getSteps() {
//don't do a defensive copy
return steps;
}
Run Code Online (Sandbox Code Playgroud)
选项#2 - 使用现场访问
您可以更改此指定JAXB应使用字段访问权限.
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Workflow {
...
}
Run Code Online (Sandbox Code Playgroud)
欲获得更多信息
| 归档时间: |
|
| 查看次数: |
1719 次 |
| 最近记录: |