我有一个包含多个数值的对象结构:
@XmlTransient
public class Person
{
private Integer age;
private Long shoeSize;
public setAge(Integer age){...}
public getAge(){return age;}
...
}
public class Child extends Person
{
private Integer readingAge;
public setReadingAge(Integer readingAge){...}
public getReadingAge(){return readingAge;}
}
public class Team
{
private ArrayList<Child> children = new Arraylist<Child>();
...
}
因此,当我对Child对象进行编组时,错过了年龄。有可能年龄可以为null,所以我不能只将它添加为int值。
@xmlTransient背后的原因是由于我需要编组来按字母顺序对整个文档进行编组。如果我删除了人物元素的瞬态,则将子元素添加到最后。
所以我的问题是: 无论如何,我可以在不将其默认为0的情况下获得认可的年龄? 我可以在不设置瞬态标志的情况下整体订购文件吗? 我试图简化我的例子,因为真实的例子有100个元素
目标XML:
<Team>
<Child>
<age>5</age>
<readingAge>25</readingAge>
<shoeSize>1</shoeSize>
</Child>
</Team>
但如果年龄为零:
<Team>
<Child>
<readingAge>25</readingAge>
<shoeSize>1</shoeSize>
</Child>
<Team>
编组班:
Child c = new Child(5, 9, 25);
Team t = new Team();
t.getChildren().put(c);
if (getMarshaller() == null)
{
JAXBContext context = JAXBContext.newInstance(Team.class);
setMarshaller(context.createMarshaller());
}
StringWriter sw = new StringWriter();
getMarshaller().marshal(t, sw);
String xmlString = sw.toString();
答案 0 :(得分:1)
因此,当我对Child对象进行编组时,错过了年龄。有一个 年龄可以为null的可能性因此我不能只将其添加为int 值。
正确,如果null
年龄应该被编组并且(稍后)再次编组为null
,那就是处理它的方法。 缺少元素是表示null
值的方式。
我可以在不设置瞬态的情况下整体订购文档 标志?
是的,您可以:类ArrayList<Child> children
中的Team
包含{em>有序 Child
个对象的集合,它们将按此顺序编组,并且(稍后)再编组回到同一个列表中。
我需要编组来按字母顺序对整个文档进行编组 顺序。
这不是JAXB会自动为您做的事情。例如,如果children
列表应按字母顺序排序,则需要对其进行排序,例如,通过调用Collections::sort
并将Team对象的字段children
作为其(第一个) )参数。 (我无法提供示例,因为我在Person
或Child
中都看不到字符串字段,甚至在XML示例中都没有。)
修改强>
我只需要涉及继承的顺序。例如。
<age> <readingAge> <shoeSize>
同样,这不是JAXB会做的事情,这是一个非常不寻常的要求。 (目的是什么?)可能你最好的选择是覆盖Child类中的Person getters,并通过使用
注释类来定义排序。@XmlType(propOrder = {"age","readingAge","shoeSize"})