什么说JAXB规范:XmlAnyAttribute与显式映射属性冲突

时间:2014-01-23 23:43:10

标签: java xml jaxb

方案

考虑以下类(省略导入):

@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement
public class Test {

    @XmlAttribute
    public int id;

    @XmlAnyAttribute
    public Map<QName,String> any;

}

执行以下操作时的行为是什么:

Test t = new Test();
t.id = 5;
t.any = new HashMap<QName,String>();
t.any.put(new QName("id"), "10");
JAXBContext jc = JAXBContext.newInstance(Test.class);
Marshaller m = jc.createMarshaller();
m.setEventHandler(myEventHandler);
m.marshal(t, System.out);

明显的问题:

应为Test的实例生成XML元素。但显而易见的问题是:具有哪些属性? <test id="5"/>?还是<test id="10"/>?或者无效的XML <test id="5" id="10"/>

请回答:

  1. 编组是否会成功(或会有例外吗?)

  2. handleEvent(ValidationEvent)myEventHandler被调用吗?如果是的话,用什么?

  3. 在System.out上可以期待什么,即什么是输出XML? (如果1.回答为肯定)

  4. (符合标准的)JAXB marshaller是否总能生成格式良好的XML? (不涉及架构)

  5. 标准库中的参考实现的行为是否符合JAXB规范,输出<test id="5" id="10"/>并报告绝对没有错误?

  6. 请根据可靠的基础做出答案:

    当然可以尝试一下。但是,应该能够通过研究Javadoc和JAXB规范文档来预测确切的行为。因此,如果可能的话,请引用文档源的相关部分来回答您的答案。

1 个答案:

答案 0 :(得分:3)

注意:我是EclipseLink JAXB (MOXy)主管,是JAXB (JSR-222)专家组的成员。

在何处查找JAXB规范

作为参考,JAXB(JSR-222)规范可以从以下位置下载:https://jcp.org/en/jsr/detail?id=222

您的问题的答案

  1. 编组是否会成功(或会有例外吗?)

    JAXB 2.2规范未涵盖此用例会发生什么。仅定义了解组用例(见B.3.6.2)。

  2. 会调用myEventHandler的handleEvent(ValidationEvent)吗?如果是的话,用什么?

    JAXB 2.2规范中没有任何内容要求这样做。

  3. 在System.out上可以期待什么,即什么是输出XML? (如果1.回答为肯定)

    此行为未定义。正如您所指出的那样,JAXB的引用和MOXy实现都将输出两个具有相同名称的属性。

  4. 一个(符合标准的)JAXB marshaller会不会生成格式良好的XML? (不涉及架构)

    您已经确定了一个不属实的案例。

  5. 标准库中的参考实现的行为是否符合JAXB规范,它输出并报告绝对没有错误?

    编组行为在规范中未定义,因此JAXB的引用(和MOXy)实现的行为不会与规范冲突。

  6. 报告问题的位置

      

    一个认真开发的软件应该,恕我直言,毫不怀疑   边缘情况下的行为。

    您可以通过Jira或邮件列表提出类似的问题。