使用JDK';不带ns2前缀的s JAXB

使用JDK';不带ns2前缀的s JAXB,jaxb,xml-namespaces,Jaxb,Xml Namespaces,在阅读了Oracle论坛、Stackoverflow、java.net上关于此的所有帖子之后,我终于在这里发布了。 我正在使用JAXB创建XML文件,但问题是它在我的元素之前添加了著名的ns2前缀,我尝试了所有没有人为我工作的解决方案。 java版本给出了“1.6.0_37” 解决方案1:使用package info.java 我在包中创建了包含@Xml*注释类的文件,内容如下: @XmlSchema( namespace = "http://mynamespace", elem

在阅读了Oracle论坛、Stackoverflow、java.net上关于此的所有帖子之后,我终于在这里发布了。 我正在使用JAXB创建XML文件,但问题是它在我的元素之前添加了著名的ns2前缀,我尝试了所有没有人为我工作的解决方案。 java版本给出了“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,它抛出异常

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

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

com.sun.xml.bind
jaxb impl
2.2.4
你能帮我吗

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

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

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

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

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

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

    并将源和目标指定为1.6。进行了maven干净的安装和打包,并部署到生产环境中,一切看起来都很好。 下一步是确保生产机器升级到Java7。希望这有帮助:)


  • 仅供参考,删除ns2只适用于JDK7(可能也适用于其他新的JAXB实现),但使用的是前面提到的简单包结构,但我需要重用域模型类,然后我也有了。PS重命名工作正常。您能告诉我如何在使用
    Moxy
    创建
    QName
    时添加正确的
    namespace URI
    prefix
    ?我已将我的问题张贴在这里,如果可能的话,请查看并提供您对基于
    Moxy
    的实施的建议: