当我将应用程序作为独立的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 -
导致此错误的原因。我错过了任何依赖。
编辑: 我在浏览器和开发环境中使用Java 7 u 59。
答案 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实现:
现在,只有在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)。