通过 CXF 在 SSL 上配置 JAX-WS

Posted

技术标签:

【中文标题】通过 CXF 在 SSL 上配置 JAX-WS【英文标题】:Configuring JAX-WS over SSL through CXF 【发布时间】:2011-04-09 14:15:04 【问题描述】:

嘿,我只是有一些相关的问题。最近生成客户端的外部 SOAP 接口更改为 https 接口。我手头有一个旧代码库,它通过 cxf 和不安全的、基于 http:// 的 wsdl 生成 java 文件。我改变了uri,在maven方面一切正常,即使测试通过。但是当我在我的主要项目中使用这个 jar 时,我得到了这个:

引起:java.lang.NoSuchMethodError: javax.net.ssl.HttpsURLConnection.getSSLSocketFactory()Ljavax/net/ssl/SSLSocketFactory; 在 sun.net.www.protocol.https.DelegateHttpsURLConnection.getSSLSocketFactory(DelegateHttpsURLConnection.java:50) 在 sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:172) 在 sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:801) 在 sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:158) 在 sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1049) 在 sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234) 在 java.net.URL.openStream(URL.java:1010) 在 org.apache.cxf.resource.URIResolver.tryFileSystem(URIResolver.java:169) 在 org.apache.cxf.resource.URIResolver.resolve(URIResolver.java:119) 在 org.apache.cxf.resource.ExtendedURIResolver.resolve(ExtendedURIResolver.java:41) 在 org.apache.cxf.transport.TransportURIResolver.resolve(TransportURIResolver.java:134) 在 org.apache.cxf.catalog.CatalogWSDLLocator.getBaseInputSource(CatalogWSDLLocator.java:72) 在 org.apache.cxf.wsdl11.AbstractWrapperWSDLLocator.getBaseInputSource(AbstractWrapperWSDLLocator.java:57) 在 org.apache.cxf.wsdl11.WSDLManagerImpl.loadDefinition(WSDLManagerImpl.java:214) 在 org.apache.cxf.wsdl11.WSDLManagerImpl.getDefinition(WSDLManagerImpl.java:179) 在 org.apache.cxf.wsdl11.WSDLServiceFactory.(WSDLServiceFactory.java:91) 在 org.apache.cxf.jaxws.ServiceImpl.initializePorts(ServiceImpl.java:207) 在 org.apache.cxf.jaxws.ServiceImpl.(ServiceImpl.java:150) 在 org.apache.cxf.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:63) 在 javax.xml.ws.Service.(Service.java:56) 在 generate.webservices.com.gbm.sso.ssoclient.AuthenticationServiceInternal.(AuthenticationServiceInternal.java:49) 在 com.gbm.caprice.sso.client.CachingSSOClient.init(CachingSSOClient.java:42) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1536) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1409) ... 45 更多

你能帮忙吗?

【问题讨论】:

【参考方案1】:

由于您得到一个 NoSuchMethodError(由编译器捕获/抛出),我的建议是您使用的是 Java 类的一个版本(在本例中为 javax.net.ssl.HttpsURLConnection)没有以下方法签名:

javax.net.ssl.HttpsURLConnection.getSSLSocketFactory()

此类可以在 JRE/lib jsse.jar 中找到(截至撰写本文时,JDK 1.6.0_21)。确保您的 java 库和 Apache CXF 库在 java CLASSPATH 中声明。

这就是我可以根据您的 caused 例外情况为您提供的帮助。

【讨论】:

说得很对。这就是我所希望的。但问题是 Apache CXF 也在类路径 amd jssee.jar 中。但是,它仍然给出了这个错误。所以,我的猜测是它与 Apache CXf 覆盖有关(意味着提供不同的 HttpsURLConnection 实现),更令人担忧的部分是,如果它进入 jsse.jar(使用 jdk 1.6.0_16)中的 HttpsURLConnection,它具有该方法。奇怪! 不,该方法不是静态的,Apache CXF 从未实现自己的 HttpsURLConnection。如果 JAVA 库和 CXF 都在类路径中,我不知道他们为什么看不到对方。 是的,这太棒了。不能完全自信地说这绝对是由于 CXF。但可能存在一些相关性,可能是 1%。好的,以不同的方式解决问题,可以做些什么来摆脱同样的问题? jsse替代品?另请注意,仅当我使用安全 SOAP 服务而不是非安全服务时才会出现问题。所以,这应该会给出一些提示。

以上是关于通过 CXF 在 SSL 上配置 JAX-WS的主要内容,如果未能解决你的问题,请参考以下文章

用于使用 SOAP Web 服务的 CXF SSL 配置

如何避免需要在 CXF 或 JAX-WS 生成的 Web 服务客户端中指定 WSDL 位置?

JAX-WS、Axis2 和 CXF 的区别

如何避免在CXF或JAX-WS生成的Web服务客户端中指定WSDL位置?

Spring Boot用Cxf的jax-ws开发WebService

apache cxf的jax-rs和jax-ws的区别