2

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

java.util.ServiceConfigurationError:javax.xml.ws.spi.Provider:提供程序 org.jboss.ws.core.jaxws.spi.ProviderImpl 无法实例化:org.jboss.resource.work.WorkWrapper 处的 java.lang.ClassCastException .completed(WorkWrapper.java:283)
at org.jboss.util.threadpool.BasicTaskWrapper.taskCompleted(BasicTaskWrapper.java:367) at org.jboss.util.threadpool.BasicTaskWrapper.run(BasicTaskWrapper.java:268) at java。 util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 在 java.lang.Thread.run(Thread.java:680)

原因:java.util.ServiceConfigurationError:javax.xml.ws.spi.Provider:提供程序 org.jboss.ws.core.jaxws.spi.ProviderImpl 无法实例化:java.util.ServiceLoader 处的 java.lang.ClassCastException。在 java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:353) 在 java.util.ServiceLoader$1.next 的 java.util.ServiceLoader.access$100(ServiceLoader.java:164) 失败(ServiceLoader.java:207) (ServiceLoader.java:421) 在 javax.xml.ws.spi.Provider.provider(Provider.java:140) 在 javax.xml 的 javax.xml.ws.spi.Provider.getProviderUsingServiceLoader(Provider.java:180)。 ws.Service.(Service.java:92)
[...]
... 3 更多原因:java.lang.Class.cast(Class.java:2990) 的 java.util.ServiceLoader 的 java.lang.ClassCastException $LazyIterator.next(ServiceLoader.java:345)
... 14 更多

我还尝试将 jbossws 从 3.1.2.GA 更新到版本 3.4.0,没有任何改变。我已经阅读了很多与检查 JBoss 的 lib/endorsed 中的 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 中添加了开关 -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 时,thisisjavax.xml.ws.spi.Provider和要转换的 arg is org.jboss.ws.core.jaxws.spi.ProviderImpl。我仍然无法理解这个问题。

4

3 回答 3

2

最后,我设法解决了我的问题:我把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 包,最终它工作了。

于 2012-06-15T12:47:41.980 回答
2

我遇到了同样的问题。我正在运行 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/endorsed。

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

于 2012-10-05T15:15:27.717 回答
2

我在 JBoss 5.1 EAP 上遇到了同样的问题,而不是将 jar 文件放入 JBOSS 应用程序服务器,当您通过使用覆盖服务器类(http://www.jboss.org/community/wiki/ )隔离 WAR 来更改类加载逻辑时,它会更加健壮classloadingconfiguration)在我的情况下,我有 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>

...

并通过将所需的 jars 添加到战争中(jaxb-api.jar、jaxb-impl.jar、jaxws-api.jar、jaxws-rt.jar)

于 2014-05-15T09:41:37.310 回答