gpt4 book ai didi

java - 使用 JAXB 按确定性顺序生成子元素

转载 作者:行者123 更新时间:2023-11-30 06:03:09 27 4
gpt4 key购买 nike

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

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

@XmlElement
public Integer a;
}

我现在注意到 JAXB 显然指定了 Foo 是否被序列化为 <foo><a>123</a><b>456</b></foo><foo><b>456</b><a>123</a></foo> 是未定义的(并且取决于 JVM 反射实现的细节)。这使得在每次应该产生相同结果的自动测试中比较输出变得困难。

我尝试添加

@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL)

到类(class)。起初这似乎工作正常,但现在解码器拒绝解析由旧代码编写的数据没有这个注释。

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

<小时/>

编辑:这实际上可能不是 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.

最佳答案

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

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

关于java - 使用 JAXB 按确定性顺序生成子元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51874719/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com