在JDK6u18中JAXB的NamespacePrefixMapper发生了什么

我一直在我的项目中使用com.sun.xml.bind.marshaller.NamespacePrefixMapper ,我在JDK 6u17中没有遇到任何问题。 现在我刚刚更新到6u18,我看到它已被替换为com.sun.xml.internal.bind.marshaller.NamespacePrefixMapper 。 但是,如果我导入此类并尝试编译我的类,我会收到错误:

包com.sun.xml.internal.bind.marshaller不存在
 import com.sun.xml.internal.bind.marshaller.NamespacePrefixMapper;

我可以通过NetBeans代码完成function访问此包,NetBeans不会突出显示错误代码。

任何帮助,将不胜感激!

我不认为类com.sun.xml.internal.bind.marshaller.NamespacePrefixMappercom.sun.xml.internal.bind.marshaller.NamespacePrefixMapper的替代品,前者已经有很长一段时间了,它并不意味着完全由你使用 (因此是internal包装)。

这里的问题是JavaSE 6没有JAXB RI(它有JAXB实现但没有JAXB RI)所以如果你想依赖RI特定的function,你应该在应用程序中捆绑JAXB RI(这样可以保护你来自Java SE中的JAXB更改)。

NamespacePrefixMapper不再可用。

使用package-info.java的注释:

 @javax.xml.bind.annotation.XmlSchema(namespace = "http://nameSpaceUri" , xmlns = { @XmlNs(prefix = "myPrefix", namespaceURI = "http://nameSpaceUri") } , elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) package my.package.; 

这适用于与JDK7捆绑在一起的JAXB,用于其他JDK版本更新JAXB到2.2.4。

在这种情况下,Sun做了一些不太合适的事情。 命名空间映射器未包含在规范中,但它被“公布”为自定义前缀的方法。 所以一般建议“不要使用com.sun.* ”在这里不适用,这个类的javadoc说:

由用户应用程序实现以确定URI – >前缀映射。

查看这篇文章 ,看看它是否适合您。

你不应该直接使用com.sun.**类。 它们被视为内部更改,如有更改,恕不另行通知。 (看看刚刚发生了什么!!)新类在包名中有internal的事实是一个更大的暗示!

我强烈建议你寻找一种更好的方法来做你正在做的事情…那不使用com.sun.**类。

编辑 – 嗯,看起来像负责JAXB RI的人已经打破了关于该扩展的包名称的Sun规则! 同样令人遗憾的是,Sun尚未在JDK 6.0中实现此特定的RI扩展。

最近我将一些旧代码移植到一个新项目时遇到了这个问题。 旧项目使用ant编译得很好,但是新项目因上面提到的错误而失败。

经过一番挖掘,我发现旧的build.xml文件使用javac编译器选项来绕过上面的限制:

    

找到它后,我搜索并发现了另一个stackoverflow问题: 使用内部sun类与javac

对于那些使用maven的人来说,通过这个链接发现包括JAXB-RI和JAXB for java6。

http://mvnrepository.com/artifact/com.googlecode.jaxb-namespaceprefixmapper-interfaces/JAXBNamespacePrefixMapper/2.2.4

堆栈溢出的下面的post回答了这个问题: 定义Spring JAXB名称空间而不使用NamespacePrefixMapper

关键是在构建时包含rt.jar并在编译后将其从应用程序中删除。