Java 使用JAXB以确定性顺序生成子元素

Java 使用JAXB以确定性顺序生成子元素,java,jaxb,saxparser,Java,Jaxb,Saxparser,我有一个大致如下形状的类: @XmlRootElement("foo") public class Foo { @XmlElement public Integer b; @XmlElement public Integer a; } 我现在注意到,JAXB显然指定Foo是否序列化为123456或456123是未定义的(取决于JVM反射实现的细节)。这使得在自动测试中比较每次应该产生相同结果的输出变得困难 我试着加上 @XmlAccessorOrder(Xml

我有一个大致如下形状的类:

@XmlRootElement("foo")
public class Foo {
    @XmlElement
    public Integer b;

    @XmlElement
    public Integer a;
}
我现在注意到,JAXB显然指定
Foo
是否序列化为
123456
456123
是未定义的(取决于JVM反射实现的细节)。这使得在自动测试中比较每次应该产生相同结果的输出变得困难

我试着加上

@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)
去上课。起初这似乎工作得很好,但现在解组器拒绝在没有此注释的情况下解析由旧代码编写的数据

有没有办法让JAXB以确定的顺序输出子元素,但接受其输入中的任何顺序


Edit:这实际上可能不是JAXB问题,但底层XML解析器中的一个比它应该的更挑剔。我得到的基本例外是

org.xml.sax.SAXParseException; lineNumber: 59; columnNumber: 16; cvc-complex-type.2.4.d: Invalid content was found starting with element 'a'. No child element is expected at this point.

您可以使用
@XmlType
proporter
定义订单,如下所示:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement("foo")
@XmlType(name = "", propOrder = {
    "a",
    "b"
})
public class Foo {
    @XmlElement
    public Integer b;

    @XmlElement
    public Integer a;
}
编辑 这是我的JAXB配置:

    //Prepare JAXB objects
    JAXBContext jc = JAXBContext.newInstance(Foo.class);
    Unmarshaller u = jc.createUnmarshaller();

    //Create an XMLReader to use with our filter
    XMLReader reader = XMLReaderFactory.createXMLReader();

    //Prepare the input, in this case a java.io.File (output)
    InputStream stream = new ByteArrayInputStream(request.getBytes(StandardCharsets.UTF_8));
    Reader isr = new InputStreamReader(stream, "UTF-8");
    InputSource is = new InputSource(isr);

    //Create a SAXSource specifying the filter
    SAXSource source = new SAXSource(is);

    //Do unmarshalling
    ret = (Foo) u.unmarshal(source);

这允许在元素以不同顺序出现的地方解析输入吗?我刚刚做了测试。是的,它允许以不同的顺序解析输入;行号:59 ;;栏目号:16;cvc复杂类型.2.4.d:发现以元素“a”开头的无效内容。此时不需要任何子元素。这可能不是JAXB问题,但取决于底层XML解析器。我已经编辑了我的答案。在我的例子中,我有
@xmlacessortype
注释,我提供了允许我将接收到的
字符串
解析到
XML
中的代码。x@Mick,你确定你解析的字符串在
之前有
?如果是这样,我不知道为什么你所做的对我不起作用。