【问题标题】:Using jaxb marshal xmlns attribute missing from xml output使用xml输出中缺少的jaxb marshal xmlns属性
【发布时间】:2012-06-14 01:13:57
【问题描述】:

我有一些从我创建的 xsd 生成的 jaxb 对象。以前当我编组内容时,xml 输出如下所示:

<report xmlns="urn:com-test-person-data:v3">
<person-data>
    .......(Data)
</person-data>
</report>

我最近从在 Windows 机器上编码转换到在 Mac 上编码。我正在使用的 jaxb 对象没有任何变化。但现在我的编组输出看起来像这样。

<report>
<person-data>
    .......(Data)
</person-data>
</report>

我已经尝试进行一些挖掘以查看可以删除 xmlns 属性的内容,但没有运气。我使用该属性来检查正在使用的架构版本,因此它在输出的 xml 片段中很重要。

这是我调用编组器的代码 sn-p:

final JAXBContext context = JAXBContext.newInstance(Report.class);
final Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); //$NON-NLS-1$
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.marshal(reportJaxBObject, sw);

有什么想法吗?

【问题讨论】:

  • 你编组的sw是什么样的对象?
  • 对不起,应该已经发布了。它是 java.io.StringWriter 的一个实例。

标签: xml xsd jaxb xml-namespaces


【解决方案1】:

此问题通常是由于 package-info.java 未与其余模型类一起编译或打包造成的。 package-info 类是指定 @XmlSchema 的位置,其中包含命名空间信息。

【讨论】:

  • 我正在使用的包含所有 jaxb 类的 jar 也有 package-info 类。我多次尝试重新构建组件,当我的消费者将其拉入时,我在参考库中的 jar 下看到了 package-info.class。尽管如此,我的 xml 输出仍然没有该属性。我对这一切都很陌生,所以还有什么我可能会遗漏的吗?
  • @vogelj - package-info 类是否与 Report 在同一个包中?如果您对设置 JAXB_FRAGMENT 属性的行进行评论,您是否也会看到相同的行为?
  • 是的,package-infoReport 在同一个包中。如果我删除 JAXB_FRAGMENT 属性,上述行为是相同的。当然,除了现在输出 xml 标签。我一直把它作为一个片段输出,这就是为什么它看起来完全是凭空出现的。
  • 我在上面发布的输出来自我拥有的一个 junit。今天我发现这个 jar 的消费者使用版本信息获得了预期的 xml。但如果他们运行 Junit,它不会返回 xmlns 属性。这让我们在这个问题上更加困惑。
  • 在 2021 年找到您的对话,因为我正在努力解决类似的问题。显然在 junit 测试中使用 PowerMock 会影响这种行为。小心!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
相关资源
最近更新 更多