Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JAXB';JDK6u18中的s NamespacePrefixMapper_Java_Jaxb - Fatal编程技术网

Java JAXB';JDK6u18中的s NamespacePrefixMapper

Java JAXB';JDK6u18中的s NamespacePrefixMapper,java,jaxb,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

在我的项目中,我一直在使用
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; 包com.sun.xml.internal.bind.marshaller不存在 导入com.sun.xml.internal.bind.marshaller.NamespacePrefixMapper; 我可以通过NetBeans代码完成功能访问这个包,NetBeans不会突出显示错误代码


任何帮助都将不胜感激

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

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


EDIT-hmmm,看来JAXB RI的负责人违反了Sun关于该扩展包名称的规则!同样不幸的是,Sun没有在JDK 6.0中实现这个特定的RI扩展。

Sun在这种情况下做了一些不太合适的事情。名称空间映射器未包含在规范中,但它作为自定义前缀的一种方式被“公布”。因此,一般建议“不要使用
com.sun.*
”在这里不适用,并且该类的

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


我不认为类
com.sun.xml.internal.bind.marshaller.NamespacePrefixMapper
com.sun.xml.bind.marshaller.NamespacePrefixMapper
的替代品,前者已经存在很长时间了,它根本不打算供您使用(因此是
内部
包装)


这里的问题是JavaSE 6没有JAXB RI(它有一个JAXB实现,但没有JAXB RI),因此如果您想依赖特定于RI的特性,您应该在应用程序中捆绑JAXB RI(这将保护您不受JavaSE中JAXB更改的影响)。

名称空间前缀apper
不再可用

使用
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。

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

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

<javac srcdir="${srcDir}" destdir="${outputDir}" classpathref="classpath" debug="on">
    <compilerarg value="-XDignore.symbol.file" />
</javac>

找到后,我搜索并找到了另一个问题:

对于那些使用maven的人来说,通过这个链接发现包括JAXB-RI和JAXB-For java6的功能都是有效的


下面关于堆栈溢出的帖子回答了这个问题:


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

对于我来说,使用JBoss,需要在WEB-INF/JBoss-deployment-structure.xml中显式添加一行

JBossAS7有一个不同于以前版本的类加载机制

在结构中添加行“”,如下所示:

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.1">

<deployment>
<dependencies>

<module name="com.sun.xml.bind" />

</dependencies>
</deployment>
</jboss-deployment-structure>


在本例中,这实际上是一个API问题,因为此功能作为确定名称空间前缀的一种方式被“公布”,而且它也是一个自定义提供程序属性。请参阅和(我的观点是,没有更好的方法可以做到这一点,这是一个基本功能)我不同意建议的解决方案。在这里,OP明确地需要将JAXB RI JAR与他的应用程序捆绑在一起(正如我在回答中所解释的),
内部
东西是为了吓跑你。另外,如果你看一下Sun的NamespacePrefixMapper.java的源代码,作者写道:“更改此类时要小心。此类应该由用户扩展,因此我们不允许破坏这些用户代码。”因此,是的,Sun将一个“应该由用户扩展”的类放入内部包中,这确实让人困惑。“检查本文”“链接死了。这听起来很合乎逻辑,但是-为什么会有这些包?@Bozho正如我所写的,Java 6包含一个JAXB实现,它不是JAXB RI,所以如果你想依赖JAXB RI特定的功能,你应该捆绑它。所以是的,博客文章是不正确的,因为作者明确使用了特定于RI的功能(这就是他面临JavaSE更改问题的原因,比如OP)@Bozho确实如此。但是
内部
包装应该让你运行并寻找另一种解决方案。使用
内部
充其量只是一种临时解决方案,你只是不知道它什么时候会坏。是的,但另一方面你已经在使用内部的东西-它在
com.sun
中,我怀疑很多人会灌输这种想法积极寻找细微的差异将我的应用程序与固定版本的JAXB RI捆绑在一起效果很好。这是必需的,因为与java捆绑的版本发生了变化。显示了一些版本。但此列表还远远不够完整。在maven中,我添加了以下构建依赖项:
com.sun.xml.bind JAXB impl 2.2.4-1
。这使您能够使用
com.sun.xml.bind.marshaller.NamespacePrefixMapper
(不带“内部”)在您使用的任何java版本上。如果您使用的是WSDL优先方法,会发生什么?每次清理项目时,您的
包信息.java
不会被wsimport覆盖吗?当我不得不面对这个问题时,我只是将自动生成的代码复制到另一个项目的源文件夹中。