在JDK6u18中JAXB的NamespacePrefixMapper发生了什么

时间:2010-02-24 12:58:44

标签: 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不会突出显示错误代码。

任何帮助将不胜感激!

8 个答案:

答案 0 :(得分:18)

我不认为班级com.sun.xml.internal.bind.marshaller.NamespacePrefixMappercom.sun.xml.bind.marshaller.NamespacePrefixMapper的替代品,前者已经存在了很长时间而且根本不会被你使用(因此internal包装)。

这里的问题是JavaSE 6没有JAXB RI(它有JAXB实现但没有JAXB RI)所以如果你想依赖RI特定的功能,你应该在你的应用程序中捆绑JAXB RI(那个将保护您免受Java SE中的JAXB更改。

答案 1 :(得分:15)

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。

答案 2 :(得分:4)

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

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

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

答案 3 :(得分:4)

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

  

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

Check this article并查看它是否适合您。

答案 4 :(得分:1)

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

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

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

找到它后,我搜索并发现了另一个stackoverflow问题: Using internal sun classes with javac

答案 5 :(得分:1)

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

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

答案 6 :(得分:1)

堆栈溢出的下面帖子回答了这个问题: Define Spring JAXB namespaces without using NamespacePrefixMapper

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

答案 7 :(得分:0)

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

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

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

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VpcCIDR
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: !Ref EnvironmentName

  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: !Ref EnvironmentName

  InternetGatewayAttachment:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      InternetGatewayId: !Ref InternetGateway
      VpcId: !Ref VPC

....