在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.NamespacePrefixMapper
是com.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。
堆栈溢出的下面的post回答了这个问题: 定义Spring JAXB名称空间而不使用NamespacePrefixMapper
关键是在构建时包含rt.jar并在编译后将其从应用程序中删除。
- 当在Spring / Hibernate项目中需要访问数据库时,exceptionjava.lang.NullPointerException
- Apache POI解析错误
- PDFBOX相同的流,带有粗体和普通文本
- 将HSQLDB与SQL Maven插件和jOOQ一起使用
- OpenShift上的OpenJDK:“NoSuchAlgorithmException:EC AlgorithmParameters not available”
- 将Java字符串传递给Javascript
- javamail是一个不太安全的应用程序吗?
- 对象准备好垃圾收集,Java
- 使用Nashorn编写Java脚本(JSR 223)和预编译