JAXB整数和长解析

时间:2015-11-13 15:23:51

标签: java jaxb

我有一个包含多个数值的对象结构:

@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();

1 个答案:

答案 0 :(得分:1)

  

因此,当我对Child对象进行编组时,错过了年龄。有一个   年龄可以为null的可能性因此我不能只将其添加为int   值。

正确,如果null年龄应该被编组并且(稍后)再次编组为null,那就是处理它的方法。 缺少元素是表示null值的方式。

  

我可以在不设置瞬态的情况下整体订购文档   标志?

是的,您可以:类ArrayList<Child> children中的Team包含{em>有序 Child个对象的集合,它们将按此顺序编组,并且(稍后)再编组回到同一个列表中。

  

我需要编组来按字母顺序对整个文档进行编组   顺序。

这不是JAXB会自动为您做的事情。例如,如果children列表应按字母顺序排序,则需要对其进行排序,例如,通过调用Collections::sort并将Team对象的字段children作为其(第一个) )参数。 (我无法提供示例,因为我在PersonChild中都看不到字符串字段,甚至在XML示例中都没有。)

修改

  

我只需要涉及继承的顺序。例如。 <age> <readingAge> <shoeSize>

同样,这不是JAXB会做的事情,这是一个非常不寻常的要求。 (目的是什么?)可能你最好的选择是覆盖Child类中的Person getters,并通过使用

注释类来定义排序。
@XmlType(propOrder = {"age","readingAge","shoeSize"})