12

在阅读了 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:命名空间前缀映射器

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

// 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,它会抛出异常。

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

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

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

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

4

2 回答 2

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"

否则,如果使用包信息

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 "".

我希望我已经给了你关于你的问题的所有答案。

于 2014-07-28T15:33:30.857 回答
0

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

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

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

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

于 2015-03-12T23:04:52.773 回答