【问题标题】:MOXy creates different namespace prefix than JAXB RIMOXy 创建与 JAXB RI 不同的命名空间前缀
【发布时间】:2014-11-21 18:35:19
【问题描述】:

我正在尝试从 JAXB RI 2.2.7 切换到 MOXy JAXB 2.5.2 实现。 我注意到生成的 XML 输出 sn-p 中命名空间和前缀的以下差异:

JAXB 注册机构:

<xbrli:xbrl xmlns:xbrli="http://www.xbrl.org/2003/instance" xmlns:bd-algemeen="http://www.nltaxonomie.nl/7.0/basis/bd/items/bd-algemeen" xmlns:iso4217="http://www.xbrl.org/2003/iso4217">
   <bd-algemeen:OperatingSystem contextRef="cc_131">W</bd-algemeen:OperatingSystem>
   <xbrli:unit id="uu_692">
        <xbrli:measure>iso4217:EUR</xbrli:measure>
    </xbrli:unit>
</xbrli:xbrl>

MOXy:

<xbrli:xbrl xmlns:xbrli="http://www.xbrl.org/2003/instance" xmlns:bd-algemeen="http://www.nltaxonomie.nl/7.0/basis/bd/items/bd-algemeen">
  <bd-algemeen:OperatingSystem contextRef="cc_131">W</bd-algemeen:OperatingSystem>
  <xbrli:unit id="uu_662">
    <xbrli:measure xmlns:ns0="http://www.xbrl.org/2003/iso4217">ns0:EUR</xbrli:measure>
   </xbrli:unit>
</xbrli:xbrl>

1) 如何配置 MOXy 以输出与 RI 相同的输出? MOXy 输出有效,但我创建的 XML(实际上是 XBRL)文档必须具有预定义的前缀。

2) 我使用“com.sun.xml.bind.marshaller.NamespacePrefixMapper”的一个实例来指示应该使用的前缀。但是 MOXy 不会在 iso4217 命名空间的情况下调用它,为什么(我调试了 MOXy 命名空间解析器但有点丢失;)? 顺便说一句:prefixMapper 被 Moxy 用于其他命名空间(如“xbrli”),但不适用于这个 iso4217,有什么区别?

我已经添加了“bd-algemeen”,因为前缀映射器被称为前缀“bd-algemeen”。此映射不使用 iso4217 使用的 QName。

3) 我尝试在生成的 iso4217 pacakge 中的 pacakage-info.java 中使用 @XmlSchema 注释来定义前缀,但没有运气,我也不想使用它,因为它涉及生成的代码很容易被覆盖。

域对象:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "divide", "measures" })
@XmlRootElement(name = "unit")
public class Unit {
    protected Divide divide;

    @XmlElement(name = "measure")
    protected List<QName> measures;
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "operatingSystem"})
public static class TaxDataBedrijf  {

   @XmlElement(name = "OperatingSystem", namespace = "http://www.nltaxonomie.nl/7.0/basis/bd/items/bd-algemeen")
   protected Astring1ItemType operatingSystem;

Unit实例的创建:

final Unit item = new Unit();
item.getMeasures().add(new QName("http://www.xbrl.org/2003/iso4217", "EUR", "iso4217"));

taxData = new TaxDataBedrijf();
taxData.setOperatingSystem(createOperatingSystem(context, 'W'));

我以为可能是QName用法的原因,不过这个在其他地方也是直接用的,而且使用正确。例如,Moxy 能够生成这个 sn-p:

<xbrli:xbrl xmlns:xbrli="http://www.xbrl.org/2003/instance" xmlns:bd-domains="http://www.nltaxonomie.nl/7.0/basis/bd/domains/bd-domains" xmlns:bd-axes="http://www.nltaxonomie.nl/7.0/domein/bd/axes/bd-axes">
  <xbrli:scenario>
     <xbrldi:explicitMember dimension="bd-axes:TimeDimension">bd-domains:Current</xbrldi:explicitMember>
  </xbrli:scenario>
</xbrli:xbrl>

以及对应的java绑定:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "value" })
@XmlRootElement(name = "explicitMember")
public class ExplicitMember {

    @XmlValue
    protected QName value;

    @XmlAttribute(name = "dimension")
    protected QName dimension;
}

这是创造:

final ExplicitMember item = new ExplicitMember();
item.setDimension(new QName("http://www.nltaxonomie.nl/7.0/domein/bd/axes/bd-axes", "TimeDimension"));
item.setValue(new QName("http://www.nltaxonomie.nl/7.0/basis/bd/domains/bd-domains", "Current"));

请就如何解决这个问题提出一些建议,以便我可以使用 MOXy 而不是 RI(可能在哪里查看 Moxy 代码?)。

【问题讨论】:

  • 您使用的是哪个版本的 EclipseLink MOXy?
  • 对不起,我忘记了,刚刚添加了它(RI:2.2.7;Moxy:2.5.2)
  • 是 MOXy 根本没有击中NamespacePrefixMapper,还是它击中了所有元素,但没有击中限定的文本值?
  • 使用了 NamespacePrefixMapper,但不适用于这个 iso4217 前缀。我只是添加了一个使用前缀映射器的映射。

标签: jaxb moxy


【解决方案1】:

您看到的行为是一个错误,我已经为它打开了以下问题:

【讨论】:

  • 哇,我知道你很快......但这非常快;)......我刚刚添加了更多工作场景......谢谢,我直到监控错误......任何想法直到它解决(周,月,..)?解决方法?我可以提供更多调试信息吗?
【解决方案2】:

我让它使用正确的命名空间表示法,也就是说,它生成:

<xbrli:unit id="uu_382">
     <xbrli:measure>iso4217:EUR</xbrli:measure>
</xbrli:unit>

我花了一些(很多;)时间调试 Moxy 代码并比较正确使用的命名空间,并发现上述 sn-p 的 ObjectFactory 不包含任何 @XmlElementDecl 注释,就像那些正在工作的注释一样。添加时,它可以工作,即:

private static final QName EUR_QNAME = new QName("http://www.xbrl.org/2003/iso4217", "EUR", "iso4217");

@XmlElementDecl(namespace = "http://www.xbrl.org/2003/iso4217", name = "EUR", substitutionHeadNamespace = "http://www.xbrl.org/2003/instance", substitutionHeadName = "item")
public JAXBElement<EUR> createEURO() {
    return new JAXBElement<EUR>(EUR_QNAME, EUR.class, null, createEUR());
}

我注意到,当创建 Xbrl(根标记)映射时,它会循环遍历属性,这些属性之一是属性“itemsAndTuplesAndContexts”。然后它遍历关联的引用元素(Moxy 代码:MappingGenerator.generateMappingForReferenceProperty(..))并将它们添加到它的命名空间解析器映射中,生成的前缀存储在它的描述符中。 在编组期间,它将使用前缀映射器来映射其存储的命名空间。因为我为 iso4217 元素添加了@XmlElementDecl 声明,所以它找到了一个引用元素,因此它被添加到 Xbrl 根元素的命名空间解析器映射中,并在前缀映射器中编组期间使用。

几个我不太清楚的问题:

  1. 为什么在 Moxy 中需要此 @XmlElementDecl,而不是 JaxB RI?
  2. 为什么在使用 XJC 生成代码期间没有生成此 @XmlElementDecl 元素?
  3. @Blaise:你认为这是一个错误吗?

属性“itemsAndTuplesAndContexts”声明:

@XmlElementRefs({ @XmlElementRef(name = "unit", namespace = "http://www.xbrl.org/2003/instance", type = Unit.class),
  @XmlElementRef(name = "context", namespace = "http://www.xbrl.org/2003/instance", type = Context.class),
  @XmlElementRef(name = "item", namespace = "http://www.xbrl.org/2003/instance", type = JAXBElement.class),
  @XmlElementRef(name = "tuple", namespace = "http://www.xbrl.org/2003/instance", type = JAXBElement.class),
  @XmlElementRef(name = "footnoteLink", namespace = "http://www.xbrl.org/2003/linkbase", type = JAXBElement.class) })
    protected List<Object> itemsAndTuplesAndContexts;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多