当前位置: 首页 > 知识库问答 >
问题:

JDK-11;JAX-WS;提供商com。太阳xml。内部的ws。spi。找不到ProviderImpl

东郭臻
2023-03-14

我需要访问JDK 11中的遗留SOAP网络服务。但是我正在遭受“找不到提供商”

JDK11实现是:zulu11。2.3-jdk11。0.1-win_x64。

在我的build.gradle,我有以下依赖:

compile group: 'com.sun.xml.ws', name: 'jaxws-rt', version: '2.3.1', ext: 'pom', { force = true }

我看到:

javax.xml.ws.WebServiceException: Provider com.sun.xml.internal.ws.spi.ProviderImpl not found
    at javax.xml.ws.spi.FactoryFinder$1.createException(FactoryFinder.java:61) ~[jaxws-api-2.3.1.jar:na]
    at javax.xml.ws.spi.FactoryFinder$1.createException(FactoryFinder.java:58) ~[jaxws-api-2.3.1.jar:na]
    at javax.xml.ws.spi.ServiceLoaderUtil.newInstance(ServiceLoaderUtil.java:103) ~[jaxws-api-2.3.1.jar:na]
    at javax.xml.ws.spi.FactoryFinder.find(FactoryFinder.java:112) ~[jaxws-api-2.3.1.jar:na]
    at javax.xml.ws.spi.Provider.provider(Provider.java:96) ~[jaxws-api-2.3.1.jar:na]
    at javax.xml.ws.Service.<init>(Service.java:112) ~[jaxws-api-2.3.1.jar:na]

以下https://github.com/javaee/metro-jax-ws/issues/1247我尝试设置:

-贾瓦克斯。xml。ws。spi。Provider=com。太阳xml。ws。spi。ProviderImpl

但是我仍然得到:

javax.xml.ws.WebServiceException: Provider com.sun.xml.ws.spi.ProviderImpl not found
    at javax.xml.ws.spi.FactoryFinder$1.createException(FactoryFinder.java:61) ~[jaxws-api-2.3.1.jar:na]
    at javax.xml.ws.spi.FactoryFinder$1.createException(FactoryFinder.java:58) ~[jaxws-api-2.3.1.jar:na]
    at javax.xml.ws.spi.ServiceLoaderUtil.newInstance(ServiceLoaderUtil.java:103) ~[jaxws-api-2.3.1.jar:na]
    at javax.xml.ws.spi.FactoryFinder.fromSystemProperty(FactoryFinder.java:122) ~[jaxws-api-2.3.1.jar:na]
    at javax.xml.ws.spi.FactoryFinder.find(FactoryFinder.java:99) ~[jaxws-api-2.3.1.jar:na]
    at javax.xml.ws.spi.Provider.provider(Provider.java:96) ~[jaxws-api-2.3.1.jar:na]
    at javax.xml.ws.Service.<init>(Service.java:112) ~[jaxws-api-2.3.1.jar:na]
    ...
Caused by: java.lang.ClassNotFoundException: com.sun.xml.ws.spi.ProviderImpl
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583) ~[na:na]
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na]
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[na:na]
    at javax.xml.ws.spi.ServiceLoaderUtil.nullSafeLoadClass(ServiceLoaderUtil.java:90) ~[jaxws-api-2.3.1.jar:na]
    at javax.xml.ws.spi.ServiceLoaderUtil.safeLoadClass(ServiceLoaderUtil.java:123) ~[jaxws-api-2.3.1.jar:na]
    at javax.xml.ws.spi.ServiceLoaderUtil.newInstance(ServiceLoaderUtil.java:101) ~[jaxws-api-2.3.1.jar:na]
    ... 22 common frames omitted

我已经验证了com.sun.xml.ws.spi.ProviderImpl是可用的:

是否有一个已知的这种组合的工作示例“在那里”?

感谢您的想法/建议。

共有3个答案

栾瑞
2023-03-14

我用这个人工制品解决了这个问题:

<dependency>
    <groupId>com.sun.xml.ws</groupId>
    <artifactId>jaxws-rt</artifactId>
    <version>2.3.5</version>
</dependency>

或者Gradle

implementation 'com.sun.xml.ws:jaxws-rt:2.3.5'

您可以在此处检查其他版本以及哪些工件依赖于此版本:https://mvnrepository.com/artifact/com.sun.xml.ws/jaxws-rt/2.3.5 .

习高格
2023-03-14

我也有同样的错误。从一个Spring应用程序中,我调用了一个OSGI包,它执行SOAP请求。就在OSGI捆绑包内调用之前,一个类加载器交换机解决了这个问题。

使用SOAP服务类中的类加载器,并在调用后重置类加载器。

    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库Java9已经被删除,JEE特定的库/实现现在必须由应用程序通过第三方库提供——例如jaxws-api.jar和jaxws-rt.jar.JEE库的代码通常仍然需要成为jre系统库和应用程序类加载器的一部分——但现在不再是了。因此,如果服务类加载器ServiceXY.class.getClassLoader()和您的应用程序类加载器Thread.currentThread(). getContextClassLoader()是不同的,您需要切换请求。

胡光霁
2023-03-14

我在java11中调用soap Web服务时遇到了完全相同的错误。通过向pom添加以下依赖项,我终于在我的测试项目中实现了它。xml

<dependency>
    <groupId>com.sun.xml.ws</groupId>
    <artifactId>rt</artifactId>
    <version>2.3.1</version>
</dependency>

由于我的生产环境尚未转换为maven,因此我发现类路径上需要这些jar文件:

jaxb-runtime-2.3.1.jar
jaxws-api-2.3.1.jar
javax.xml.soap-api-1.4.0.jar
rt-2.3.1.jar
streambuffer-1.5.3.jar
policy-2.7.5.jar
stax-ex-1.8.jar
javax.jws-api-1.1.jar
saaj-impl-1.5.0.jar
gmbal-api-only-3.1.0-b001.jar 
 类似资料:
  • 我正在将Spring Boot应用程序转换为Quarkus,作为概念证明。当我构建Quarkus应用程序并用Java运行它时,它运行良好,但当我尝试将其作为本机应用程序运行时,我在内部sun类(com.sun.xml.internal.ws.spi.ProviderImpl)上得到一个ClassNotFoundException,因为它在Java中运行,我希望本机应用程序也能工作。 我正在使用:

  • JAX-WS (JavaTM API for XML-Based Web Services)规范是一组XML web services的JAVA API。JAX-WS允许开发者可以选择RPC-oriented或者message-oriented 来实现自己的web services。 在 JAX-WS中,一个远程调用可以转换为一个基于XML的协议例如SOAP。在使用JAX-WS过程中,开发者不需要

  • Apache CXF WebService 没有话说,享受沉默 showcase项目已演示了JAX-WS2.0 + CXF 的最重要特性, 其中客户端在测试用例里. SOAP这个名字,本身就是个笑话,一点都不Simple。其他一些WS-*协议,包括安全,附件等都不再看好,因此SpringSide4.0没什么更新。 测试工具依然是SoapUI。 Tips 1. CXF自动生成的WSDL与WADL文件

  • 我有一个带有jaxb-impl.jar的第三方jar,并将其包含在清单类路径中。问题是,提供自己的JAXB版本(不管它是哪个版本)似乎会破坏JAX-WS中的SoapFaultBuilder。 根据非官方的JAXB指南,Sun在将JAXB折叠到JDK中时似乎故意更改了包名,以避免与独立版本发生冲突。但是,JDK附带的SoapFaultBuilder(我相信是JAX-WS的一部分)明确依赖于新的内部包

  • 问题内容: 我构建了一个最小的Web服务,并使用javax.xml.ws.Endpoint发布了它。如果我尝试获得WSDL, 它就可以正常工作。 尝试在接收它,我什么也没收到。该地址与本地主机相同。 是否可以在不提供地址的情况下发布网络服务? 将代码更改为 在IP地址上获取wsdl,但不在本地主机上获取。 是否没有可能仅定义端口? 问题答案: 您可以尝试在0.0.0.0上发布它吗?

  • 问题内容: 有人可以为入门JAX-WS提供一些好的教程吗?使用wsgen等各种工具… 问题答案: 您可以从这里开始: Java SE 6平台简介JAX-WS 2.0,第1部分 Java SE 6平台简介JAX-WS 2.0,第2部分 NetBeans对JAX-WS确实具有很好的支持,并且提供了许多教程,例如: JAX-WS Web服务入门 Glen Mazza在JAX-WS RI / Metro上