【问题标题】:How to set the default namespace using JAXB如何使用 JAXB 设置默认命名空间
【发布时间】:2013-07-04 21:32:01
【问题描述】:

我有一个通过 Spring MVC Web 服务返回的数据的 ATOM-XML 表示。我正在使用 JAXB 进行序列化,我有许多命名空间,但我希望将默认命名空间设置为没有前缀的 Atom。这是我目前在package-info.java 中的内容,但原子前缀设置为 ns3。

@XmlSchema(namespace = com.mycomponay.foo.ATOM_NAMESPACE,
xmlns = { 
    @XmlNs(prefix = "foo", namespaceURI = com.mycomponay.foo.NAMESPACE_FOO),
}, elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.mycompany.web;

import javax.xml.bind.annotation.XmlNs;

我还注意到命名空间在 chrome 中显示,但在 Firefox 中没有。

【问题讨论】:

  • 只是好奇:你为什么介意使用什么命名空间前缀?

标签: java serialization jaxb atom-feed


【解决方案1】:

尝试为您希望作为默认名称显示的命名空间添加带有前缀 ""@XmlNs 注释。

@XmlSchema(
    namespace = com.mycompany.foo.ATOM_NAMESPACE,
    xmlns = { 
        @XmlNs(prefix = "", namespaceURI = com.mycompany.foo.ATOM_NAMESPACE),
        @XmlNs(prefix = "foo", namespaceURI = com.mycompany.foo.NAMESPACE_FOO)
    }, 
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.mycompany.web;

import javax.xml.bind.annotation.*;

注意:

@XmlSchema 注释中指定的命名空间旨在影响 XML 模式的生成,并且不能保证在将对象模型编组为 XML 时使用。但是EclipseLink JAXB (MOXy) 和最新版本的JAXB reference implementation 将尽可能使用它们。

更多信息

【讨论】:

  • 感谢 Blaise,但这不起作用,因为 ATOM 命名空间被设置为“ns4”。我正在使用使用 Jaxb2RootElementHttpMessageConverter 的 Spring MVC 我尝试扩展它并使用我的自定义 com.sun.xml.internal.bind.namespacePrefixMapper 添加设置 NamespacePrefixMapper 属性,但没有运气。
  • 我已经让它与我的自定义 NamespacePrefixMapper 一起工作,它正在被调用。现在我遇到了另一个问题,当我的自定义NamespacePrefixMapper 被称为空前缀时,defaultNsUri 已经采用了JAXBContextImpl 中的硬编码。有人知道这个问题的解决方案吗?
  • XMLConstants.DEFAULT_NS_PREFIX 不是首选吗?
  • 这是该问题的正确答案。您仍然必须在根元素注释中定义没有命名空间参数的 @XmlRootElement(name="name") 。否则将添加 ns1.. 类似的命名空间。
【解决方案2】:

如果您为 XML 元素使用单独的类,则使用 namespace="" 对其进行注释,这样会起作用。

【讨论】:

    猜你喜欢
    • 2013-09-06
    • 2012-03-13
    • 2011-02-21
    • 1970-01-01
    • 2015-04-13
    • 2019-02-17
    • 1970-01-01
    • 2016-03-13
    相关资源
    最近更新 更多