Web Services JDK11; JAX-WS;找不到提供者com.sun.xml.internal.ws.spi.ProviderImpl

ttisahbt  于 2022-11-15  发布在  其他
关注(0)|答案(4)|浏览(223)

我需要访问JDK 11中的旧版SOAP Web服务。但我遇到了“找不到ProviderImpl”的问题。
JDK 11实现为:11.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 }

我的WAR文件的WEB-INF/lib包含x1c 0d1x
我看到:

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我已尝试设置:


但我还是得到:

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是否可用:

是否有这种组合的已知工作示例?
我们非常感谢您的意见/建议。

x3naxklr

x3naxklr1#

我在java 11中调用soap-webservices时遇到了完全相同的错误。

<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
bmvo0sr5

bmvo0sr52#

我用这个艺术品算出了这个:

<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

8qgya5xd

8qgya5xd3#

我也遇到了同样的错误。我从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);
    }

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

mpgws1up

mpgws1up4#

经过大量的官方文件和反复试验的方法,我们终于找到了正确的配置,如下所示,
在.pom文件中添加以下依赖项,

<dependency>
        <groupId>com.sun.xml.ws</groupId>
        <artifactId>jaxws-ri</artifactId>
        <version>2.3.2</version>
        <type>pom</type>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.ws</groupId>
        <artifactId>rt</artifactId>
        <version>2.3.2</version>
    </dependency>

要包含负责将这些类加载到重新启动类加载器(在spring-devtools中使用)的JAR,请更新/src/main/resources/META-INF/spring-devtools.properties,如下所示:
jax=/jaxws-rt.*.jar文件中的文件名

相关问题