在JDK6u18中JAXB的NamespacePrefixMapper发生了什么

Dan*_*lay 25 java jaxb

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

package com.sun.xml.internal.bind.marshaller does not exist
import com.sun.xml.internal.bind.marshaller.NamespacePrefixMapper;

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

任何帮助,将不胜感激!

Pas*_*ent 18

我不认为这个课程com.sun.xml.internal.bind.marshaller.NamespacePrefixMapper是一个替代品com.sun.xml.bind.marshaller.NamespacePrefixMapper,前者已经有很长一段时间了,而且它并不意味着你可以全部使用(因此internal包装).

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

  • 将我的应用程序与固定版本的JAXB RI捆绑在一起工作正常.它与java更改捆绑在一起的版本是必需的.[这里]显示了几个版本(https://jaxb.java.net/guide/Which_JAXB_RI_is_included_in_which_JDK_.html).但这份清单远未完成.在maven中,我添加了以下构建依赖:`<dependency> <groupId> com.sun.xml.bind </ groupId> <artifactId> jaxb-impl </ artifactId> <version> 2.2.4-1 </ version> < /依赖性>`.这使您可以在您使用的任何Java版本上使用`com.sun.xml.bind.marshaller.NamespacePrefixMapper`(不带"internal"). (5认同)

Dan*_*eón 16

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.;
Run Code Online (Sandbox Code Playgroud)

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


Ste*_*n C 5

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

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

编辑- 嗯,看起来负责 JAXB RI 的人违反了 Sun 关于该扩展包名称的规则!而且很遗憾,Sun 没有在 JDK 6.0 中实现这个特殊的 RI 扩展。