【问题标题】:Exception coming: java.util.ServiceConfigurationError出现异常:java.util.ServiceConfigurationError
【发布时间】:2014-07-08 06:03:14
【问题描述】:

运行我的应用程序时出现以下异常:

我正在使用 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 问题。

【问题讨论】:

  • 您似乎使用了不正确的 javax.xml.ws.spi.Provider 子类型。请在您遇到此问题的地方发布代码。
  • 提供一些代码可能会有所帮助,例如CMDB 第 239 行

标签: java jakarta-ee jboss5.x


【解决方案1】:

我在部署带有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 调整

因此,我将 &lt;scope&gt;provided&lt;/scope&gt; 添加到 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 文件。

在 JBoss AS 中复制和删除 jars

现在,在部署 .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 文件中捆绑的所有 jar。

基本做到了。


结语

我不得不承认,发现这一点是一个真正的痛苦,我花了大约四天的时间才开始运行它。 我对 jar 依赖项进行了很多故障排除,检查 JBoss 日志,远程调试,比较 Java 包和类版本,在线搜索 jar 并阅读 JBoss 手册、博客、StackOverflow、JavaRanch 等中的许多文章...

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

问候。

【讨论】:

  • 我在 Wildfly 上遇到了同样的问题。请参阅stackoverflow.com/questions/37158821/…。你有什么新想法吗?问题是我无法“操纵”Wildfly 本身,因为一切都在云中运行,我无权操纵应用程序服务器。
【解决方案2】:

尝试切换类加载器。

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

    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() 不同,您需要针对请求进行切换。

【讨论】:

    猜你喜欢
    • 2016-06-21
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 2013-03-08
    相关资源
    最近更新 更多