JaxWS ClassCastException on JBoss



我正在使用JBoss 5.1.0.GA(用于JDK6)和jaxws 2.2.6。当我调用 Web 服务时,出现以下异常:

java.util.ServiceConfigurationError: javax.xml.ws.spi.Provider: Provider org.jboss.ws.core.jaxws.spi.ProviderImpl can't be 实例化:java.lang.ClassCastException at org.jboss.resource.work.WorkWrapper.complete(WorkWrapper.java:283)
在 org.jboss.util.threadpool.BasicTaskWrapper.taskComplete(BasicTaskWrapper.java:367) 在 org.jboss.util.threadpool.BasicTaskWrapper.run(BasicTaskWrapper.java:268) 在 java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:680)

引起: java.util.ServiceConfigurationError: javax.xml.ws.spi.Provider: Provider org.jboss.ws.core.jaxws.spi.ProviderImpl can't be 实例化:java.lang.ClassCastException at java.util.ServiceLoader.fail(ServiceLoader.java:207) at java.util.ServiceLoader.access$100(ServiceLoader.java:164) at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:353) at java.util.ServiceLoader$1.next(ServiceLoader.java:421) at javax.xml.ws.spi.Provider.getProviderUsingServiceLoader(Provider.java:180) at javax.xml.ws.spi.Provider.provider(Provider.java:140) at javax.xml.ws.Service.(服务.java:92)
[...]
...3 更多 原因: java.lang.ClassCastException at java.lang.Class.cast(Class.java:2990) at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:345)
...还有 14 个

我还尝试将 jbossws 从 3.1.2.GA 更新到 3.4.0 版,没有任何变化。我已经阅读了很多与在 lib/认可 JBoss 中检查 jar 相关的建议,所以这是内容:

activation.jar
jaxb-api.jar
jaxws-api.jar
jbossws-native-factories.jar
resolver.jar
serializer.jar stax-api.jar
xalan.jar
xercesImpl.jar

我还在 JVM 中添加了 switch -verbose:class:

[Loaded org.jboss.ws.core.jaxws.spi.ProviderImpl from jar:file:/Users/carlo/jboss-5.1.0.GA/common/lib/jbossws-native-core.jar!/]

并且该类扩展javax.xml.ws.spi.Provider(http://bit.ly/LK9bNE)

有人可以帮我这里发生了什么吗?

编辑 1
好的,所以我看到 ClassCastException 是从以下位置引发的:ServiceLoader.java第 345 行

S p = service.cast(Class.forName(cn, true, loader).newInstance());

调用 Service.cast 时,javax.xml.ws.spi.Provider this,要强制转换的参数org.jboss.ws.core.jaxws.spi.ProviderImpl 。不过,我仍然无法理解这个问题。

最后,我设法解决了我的问题:我把jaxws-rt.jar放在$JBOSS_HOME/lib/endorsed

编辑
我在 JBoss 5.1 EAP 上遇到了同样的问题,为了解决它,步骤略有不同:在$JBOSS_HOME/lib/endorsed我删除了旧的jaxb-api.jar,然后复制了

  • JAXB-API.jar
  • JAXB-IMPL.jar
  • Jaxws-API.jar
  • Jaxws-RT.jar

从最新的 Jaxws-ri 软件包开始,最终它奏效了。

我遇到了同样的问题。 我正在运行 JBoss 5.1 EAP 和 JDK 1.6_22。

我做的事情略有不同。 我将 Carlo 的解决方案与这个解决方案结合起来。

我在 $JBOSS_HOME/server//lib/endorsed 下创建了一个背书文件夹。 然后我复制了streambuffer.jar,stax-ex.jar,policy.jar,jaxws-rt.jar,jaxws-api.jar,jaxb-impl.jar,jaxb-api.jar和gmbal-api-only.jar。

我独自离开了$JBOSS_HOME/lib/背书。

这样做,我能够让它工作,一切都能正常工作

我在 JBoss 5.1 EAP 上遇到了同样的问题而不是将jar文件放入JBOSS应用程序服务器,当您通过使用覆盖服务器类(http://www.jboss.org/community/wiki/classloadingconfiguration)隔离WAR来更改类加载逻辑时,它更健壮 就我而言,我有3个环境。使用此解决方案,我可以将战争文件从一个 JBOSS 实例移动到另一个实例,它仍然可以工作。

我通过以下方式解决了这个问题:将其添加到 jboss-web.xml:

<class-loading java2ClassLoadingCompliance="false">
    <loader-repository>
        com.example:archive=unique-archive-name
        <loader-repository-config>java2ParentDelegation=false</loader-repository-config>
    </loader-repository>
</class-loading>

以及通过将 requierd jars 添加到 war 中 (jaxb-api.jar, jaxb-impl.jar, jaxws-api.jar, jaxws-rt.jar)

最新更新