JBoss上的JaxWS ClassCastException

时间:2012-06-15 10:08:53

标签: java jax-ws jboss5.x

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

  

java.util.ServiceConfigurationError:javax.xml.ws.spi.Provider:   提供者org.jboss.ws.core.jaxws.spi.ProviderImpl不可能   实例化:java.lang.ClassCastException at   org.jboss.resource.work.WorkWrapper.completed(WorkWrapper.java:283)
    在     org.jboss.util.threadpool.BasicTaskWrapper.taskCompleted(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)     在java.lang.Thread.run(Thread.java:680)

     

引起:     java.util.ServiceConfigurationError:javax.xml.ws.spi.Provider:     提供者org.jboss.ws.core.jaxws.spi.ProviderImpl不可能   实例化: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 at   java.util.ServiceLoader $ 1.next(ServiceLoader.java:421)at   javax.xml.ws.spi.Provider.getProviderUsingServiceLoader(Provider.java:180)   在javax.xml.ws.spi.Provider.provider(Provider.java:140)at   javax.xml.ws.Service。(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个

我还尝试从3.1.2.GA更新jbossws到版本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

我还将switch -verbose:class添加到JVM:

[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 line 345

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

调用service.cast时,thisjavax.xml.ws.spi.Provider,而要投射的参数为org.jboss.ws.core.jaxws.spi.ProviderImpl。 我仍然无法理解这个问题。

3 个答案:

答案 0 :(得分: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软件包,最终有效。

答案 1 :(得分:2)

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

我做的事略有不同。我将解决方案加入了Carlo加this solution

我在$ 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 / endors。

这样做,我能够让它全部工作

答案 2 :(得分:2)

我在JBoss 5.1 EAP上遇到了同样的问题 不是将jar文件放入JBOSS应用程序服务器,而是通过将WAR与覆盖服务器类隔离来改变类加载逻辑(http://www.jboss.org/community/wiki/classloadingconfiguration),而不是将jar文件更强大。在我的情况下,我有3个环境。使用此解决方案,我可以将war文件从一个JBOSS实例移动到另一个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 jar加入战争(jaxb-api.jar,jaxb-impl.jar,jaxws-api.jar,jaxws-rt.jar)