创建JAXB Context的JAXBException

时间:2015-08-28 10:28:37

标签: java jaxb applet java-web-start

当我将应用程序作为独立的Java程序运行时,它运行良好。当我将它作为applet运行时,它会抛出JAXBException以及下面的stacktrace。

javax.xml.bind.JAXBException: jaxb.properties in package com/test/package does not contain the javax.xml.bind.context.factory property.
    at javax.xml.bind.ContextFinder.find(Unknown Source)
    at javax.xml.bind.JAXBContext.newInstance(Unknown Source)
    at javax.xml.bind.JAXBContext.newInstance(Unknown Source)

当我添加一个jaxb.properties时,我得到以下错误 -

javax.xml.bind.JAXBException
 - with linked exception:
[java.lang.NoSuchMethodException: com.sun.xml.internal.ws.developer.JAXBContextFactory.createContext([Ljava.lang.Class;, java.util.Map)]
    at javax.xml.bind.ContextFinder.newInstance(Unknown Source)
    at javax.xml.bind.ContextFinder.newInstance(Unknown Source)
    at javax.xml.bind.ContextFinder.find(Unknown Source)
    at javax.xml.bind.JAXBContext.newInstance(Unknown Source)
    at javax.xml.bind.JAXBContext.newInstance(Unknown Source)

我将以下jar添加到classpath -

  • JAXWS-RT-2.2.1
  • JS​​R311-API-1.1.1
  • 球衣核-1.2
  • Jersey的客户端 - 1.2

导致此错误的原因。我错过了任何依赖。

编辑: 我在浏览器和开发环境中使用Java 7 u 59。

5 个答案:

答案 0 :(得分:0)

泽西岛版本1.2似乎过时了。我认为Jersey 2.21是当前版本。此外,您应该检查您正在使用哪个JDK / JRE来运行程序。 applet是否在与将其作为应用程序启动时相同的环境/ Java版本中运行?

答案 1 :(得分:0)

首先,您需要检查是否使用相同的JRE。你可以这样做here.正如@LarsGendner所提到的那样 - download JAXB 2.2。* jar,因为1.2已经过时了。

第二:看看这个主题:How can I use JAXB from an unsigned applet (without signing it)?

答案 2 :(得分:0)

根据您提供的信息,以下是我的输入。请注意任何需要您输入/试用的内容,我已将其标记为<try-out>

首先<try-out>以下:

一个。验证您没有在内部看到多个java版本已检查:widnows-&gt; control panel-&gt; java-&gt; java tab-&gt;查看java位置。基本上这是为了确保您的Java应用程序和applet使用相同的JRE。

关于您的第一个例外: javax.xml.bind.JAXBException: jaxb.properties in package com/test/package does not contain the javax.xml.bind.context.factory property

这是JRE无法找到JAXB实现的问题。请浏览URL并找到“发现JAXB实现”部分。 它提到以下4个位置用于识别JAXB实现:

  1. 在包级目录
  2. 中查找jaxb.properties
  3. 系统属性JAXB_CONTEXT_FACTORY
  4. 在所有罐子里寻找/META-INF/services/javax.xml.bind.JAXBContext文件
  5. 默认的JVM特定实现。
  6. 现在,只有在Applet NOT for JAVA应用程序的情况下才会出现此异常您提到java应用程序和applet都使用相同的JDK +附加jar。我能想到applet和应用程序环境之间差异的唯一原因可能是由于上面的第2点

    <try-out>以下:

    b。您可以在运行Java应用程序时检查是否将JAXB_CONTEXT_FACTORY指定为系统属性(可能通过eclipse或其他方式)

    ℃。可能是您可以在代码中打印所有系统属性:

    Properties props = System.getProperties();
    props.list(System.out);
    

    并验证是否在那里设置了JAXB上下文工厂?

    关于您的第二个例外: 添加jaxb.properties文件后,您收到了第二个异常。可能是由于以下原因: - 异常堆栈跟踪显示您可能在com.sun.xml.internal.ws.developer.JAXBContextFactory文件中指定了JAXB.properties。 现在,如果您再次看到URL并找到JAXBContext提供程序的第一个SPEC REQUIREMENT:提供程序必须提供包含以下方法签名的实现类:

    public static JAXBContext createContext( Class[] classes, Map<String,Object> properties ) throws JAXBException
    

    此外,如果您使用com.sun.xml.internal.ws.developer.JAXBContextFactory课程的Google内容,您可以在此site看到此课程不包含方法createConext();它只定义一个方法调用createJAXBContext()。请注意,此类由com.sun.xml.internal.bind.api.JAXBRIContext在内部调用javax.xml.bind.JAXBContext类的扩展名。

    <try-out>以下:

    d。您应该在javax.xml.bind.context.factory文件中指定jaxb.properties的正确值,该值指向实现createConext()操作的类。

    最后,最后一点: 您可能在jaxb.properties中指定了正确的工厂,但运行时可能无法选择其值,而是运行时从上面第1-4点中指定的其他机制中选择JAXB实现值。这可能是JVM运行时中存在多个JAXB工厂实现的情况。

    <try-out>以下:

    即在这种情况下,最好使用此post

    中指定的Java认可的覆盖机制

答案 3 :(得分:0)

从异常开始,我知道你的WS引用了java rt.jar而没有引用你在类路径中添加的jar。

因此,我可以得出结论,jar并没有完全放在classPath中。

答案 4 :(得分:0)

第二例外: 检查从哪个jar引用的类,并替换具有createjaxbcontext方法的正确jar文件。

在类路径中使用正确版本的jar(jaxws-rt)。