【问题标题】:Using JDK's JAXB without ns2 prefix使用没有 ns2 前缀的 JDK 的 JAXB
【发布时间】:2013-01-30 10:34:46
【问题描述】:

在阅读了 Oracle 论坛、Stackoverflow、java.net 上所有关于此的帖子后,我终于在这里发帖了。 我正在使用 JAXB 创建 XML 文件,但问题是它在我的元素之前添加了著名的 ns2 前缀,我已经尝试了所有没有人为我工作的解决方案。 java -version 给出“1.6.0_37”

解决方案 1:使用 package-info.java

我在我的包中创建了包含@Xml* 注释类的文件,其内容如下:

@XmlSchema(
    namespace = "http://mynamespace",
    elementFormDefault = XmlNsForm.QUALIFIED,
    xmlns = {
        @XmlNs(namespaceURI = "http://mynamespace", prefix = "")
    }
)
package com.mypackage;
import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

解决方案 2:NamespacePrefixMapper

我创建了以下类并将映射器设置为编组器:

// Change mapper to avoid ns2 prefix on generated XML
class PreferredMapper extends NamespacePrefixMapper {
    @Override
    public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
        return "";
    }
}
NamespacePrefixMapper mapper = new PreferredMapper();
try {
    marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", mapper);
}
catch (PropertyException e) {
   logger.info("No property for com.sun.xml.bind.namespacePrefixMapper found : " + e.getMessage());
}

使用 com.sun.xml.bind.namespacePrefixMapper 没有任何反应,使用 com.sun.xml.internal.bind.namespacePrefixMapper 会引发异常。 p>

我还在 pom 中添加了 maven 依赖,但似乎 JRE 版本的优先级更高:

<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.2.4</version>
</dependency>

你能帮我解决这个问题吗?

PS:由于构建原因,我无法将 jar 直接包含在我的类路径中。 PS2:我不能使用 JDK7。 提前致谢。

【问题讨论】:

  • 仅供参考,删除 ns2 仅适用于 JDK7(可能也适用于其他新的 JAXB 实现),但在简单的包结构中,如提到的 here,但我需要重用域模型类,然后我也有 @987654322 @。 PS重命名完美。

标签: jaxb xml-namespaces


【解决方案1】:

没有 MOXy 的实现是不可能的。如果首选前缀是“”,则 JAXB 会生成一个新前缀。

我以前也遇到过同样的问题,我为每个package-info.java配置了每个前缀。

NamespacePrefixMapper 用 JAVADOC 表示

null if there's no prefered prefix for the namespace URI.
In this case, the system will generate a prefix for you.

Otherwise the system will try to use the returned prefix,
but generally there's no guarantee if the prefix will be
actually used or not.

return "" to map this namespace URI to the default namespace.
Again, there's no guarantee that this preference will be
honored.

If this method returns "" when requirePrefix=true, the return
value will be ignored and the system will generate one"

else if use package-info

we know we can't bind to "", but we don't have any possible name at hand.
generate it here to avoid this namespace to be bound to "".

我希望我已经为您提供了有关您问题的所有答案。

【讨论】:

  • 您能否告诉我如何在使用Moxy 创建QName 时添加正确的namespace URIprefix?如果可能的话,我已经在这里发布了我的问题,请查看并提供您对基于 Moxy 的实施的建议:stackoverflow.com/questions/67553941/…
【解决方案2】:

我今天也遇到了同样的问题。生产机器有 Java 6,当我部署我的应用程序时,我得到了 ns2 前缀。这就是我解决它的方法。生产服务器只有 Java 1.6 补丁 21

  1. 我确保我的包中有一个 package-info.java 文件,其中所有类都是使用 Jaxb 生成的。我检查了它,@XmlSchema 都是自动生成的,所以我没有搞砸这些。不要使用 namespacemapper,这让我很困惑。

  2. 在我的 pom.xml 文件中,我添加了 jaxb-impl 依赖项: com.sun.xml.bind jaxb-impl 2.2.5-b04

    并将源和目标指定为 1.6。做了一个 Maven 干净安装和打包并部署到生产中,一切看起来都很好。 下一步是确保生产机器升级到 Java 7。希望这会有所帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 2017-06-05
    相关资源
    最近更新 更多