异常即将发生:java.util.ServiceConfigurationError

时间:2014-07-08 06:03:14

标签: java java-ee jboss5.x

在运行我的应用程序时获得以下异常:

我使用的是jboss:5.1.1和jdk 1.6。

01:50:04,828 ERROR [[HelloWorld]] Servlet.service() for servlet HelloWorld threw exception
java.util.ServiceConfigurationError: javax.xml.ws.spi.Provider: Provider org.jboss.ws.core.jaxws.spi.ProviderImpl not a subtype
    at java.util.ServiceLoader.fail(Unknown Source)
    at java.util.ServiceLoader.access$300(Unknown Source)
    at java.util.ServiceLoader$LazyIterator.next(Unknown Source)
    at java.util.ServiceLoader$1.next(Unknown Source)
    at javax.xml.ws.spi.Provider.getProviderUsingServiceLoader(Provider.java:146)
    at javax.xml.ws.spi.Provider.provider(Provider.java:106)
    at javax.xml.ws.Service.<init>(Service.java:57)
    at com.service_instance.ServiceInstance.<init>(ServiceInstance.java:50)
    at com.getBusinessApp(CMDB.java:239)
    at com.test.HelloWorld.doGet(HelloWorld.java:51)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
    at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
    at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
    at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Unknown Source)

我们知道。如何解决这个问题。这似乎是一些lib问题。

2 个答案:

答案 0 :(得分:5)

我在部署带有Mobicents Jain Slee的USSD网关时遇到了同样的问题,该网关运行在JBoss AS 5.1.0 GA之上。网关必须通过SOAP连接到服务器,因此我选择了JAX-WS并使用wsimport从WSDL生成源代码。 顺便说一句,我使用类似于this one的过程来创建子Maven项目并为JAX-WS生成java文件。


在.war文件中嵌入了依赖项的部署失败

我的第一种方法是将所有依赖项包含在JBoss中部署的.war文件中。 我认为默认情况下这是在Maven中实现的,mvn install会这样做。 从长远来看,这种方法失败了,但至少我需要知道.war文件中包含的jar文件列表,稍后将它们复制到JBoss目录中。

我使用这种方法做了很多故障排除,并且有许多不同的日志错误,但主要的是这个:

java.util.ServiceConfigurationError: javax.xml.ws.spi.Provider: Provider org.jboss.ws.core.jaxws.spi.ProviderImpl not a subtype

无依赖部署

Maven调整

因此,我将<scope>provided</scope>添加到JAX-WS依赖项中。类似的东西:

<dependency>
    <groupId>com.sun.xml.ws</groupId>
    <artifactId>jaxws-rt</artifactId>
    <version>2.2</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>com.sun.istack</groupId>
    <artifactId>istack-commons-runtime</artifactId>
    <version>2.2</version>
    <scope>provided</scope>
</dependency>

这产生了一个更轻的.war文件。

复制&amp;删除JBoss AS中的jar

现在,在部署.war文件之后,当我的SOAP客户端尝试连接到Web服务时,它抛出异常:

org.jboss.ws.metadata.wsdl.WSDLException: Invalid default namespace: null
at org.jboss.ws.tools.wsdl.WSDLDefinitionsFactory.parse(WSDLDefinitionsFactory.java:134)
at org.jboss.ws.metadata.umdm.ServiceMetaData.getWsdlDefinitions(ServiceMetaData.java:293)
at org.jboss.ws.metadata.builder.jaxws.JAXWSClientMetaDataBuilder.buildMetaData(JAXWSClientMetaDataBuilder.java:84)
at org.jboss.ws.core.jaxws.spi.ServiceDelegateImpl.<init>(ServiceDelegateImpl.java:138)
at org.jboss.ws.core.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:63)
at javax.xml.ws.Service.<init>(Service.java:79)
at org.ortelius.UssdServiceImplementation.<init>(UssdServiceImplementation.java:42)
at org.ortelius.OrteliusClient.sendUssdRequestToWs(OrteliusClient.java:28)

似乎javax.xml.ws.Service调用org.jboss.ws.core.jaxws.spi.ProviderImpl,但它应该调用com.sun.xml.ws.spi.ProviderImpl,因此似乎与jar依赖项存在冲突。

为了避免这个问题,有必要:

  1. 移动或删除$JBOSS_HOME/lib/endorsed/目录中的所有JBoss jar文件。
  2. 将我最初的.war文件(失败的部署之一)中捆绑的jar复制到$JBOSS_HOME/lib/endorsed/目录。 我的.war文件中捆绑的所有罐子。
  3. 基本上就是这样。


    最后的笔记

    我必须承认,发现这是真正的痛苦,我花了大约四天的时间来解决这个问题。运行。 我对jar依赖项进行了大量的故障排除,检查JBoss日志,远程调试,比较Java包和&amp;类版本,在线搜索jar并阅读JBoss手册,博客,StackOverflow,JavaRanch等许多文章......

    SOAP客户端非常简单,但JBoss中的部署非常有问题。 我的解决方案不是很正统,因为它在很大程度上取决于jar文件的依赖性。 所以我不确定它是否适合所有人。

    问候。

答案 1 :(得分:0)

尝试切换类加载器。

从服务类中获取类加载器,并在调用后重置。

    final ClassLoader targetClassLoader = ServiceXY.class.getClassLoader();
    final Thread currentThread = Thread.currentThread();
    final ClassLoader contextClassLoader = currentThread.getContextClassLoader();
    try {
           currentThread.setContextClassLoader(targetClassLoader);
           //here call your Service 
    } finally {
           currentThread.setContextClassLoader(contextClassLoader);
    }

JEE库已被Java 9删除,现在必须由应用程序通过第三方库提供JEE特定的库/实现。 jaxws-api.jar和jaxws-rt.jar。 JEE库的此代码通常仍然期望成为jre系统库以及应用程序类加载器的一部分-但现在不再存在。因此,如果服务类加载器ServiceXY.class.getClassLoader()和应用程序类加载器Thread.currentThread().getContextClassLoader()不同,则需要切换请求。