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,你确定你解析的字符串在
之前有
?如果是这样,我不知道为什么你所做的对我不起作用。