问题:
我正在调用SOAP Web服务,但需要在每次调用时更改URL。但是,wsdl中的终点是一个内部地址,所以我试图自己编辑端点。假设这是正确的事情(?),我得到 java.io.IOException:HTTP URLConnection Factory的非法协议https ,我正在努力解决。
代码:
OtherCompanyWebService ws = new OtherCompanyWebService();
OtherCompanyWebServicePortType port = ws.getOtherCompanyWebServiceHttpSoap11Endpoint();
ServiceRequest serviceRequest = makeMyServiceRequest();
BindingProvider bindingProvider = (BindingProvider) port;
bindingProvider.getRequestContext().put(
BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
"https://blah.blah.com/blah/services/blahWebService.blahWebServiceHttpSoap11Endpoint");
Staff staff = port.getStaffData(serviceRequest).getStaff().getValue();
Stacktrace:
javax.xml.ws.soap.SOAPFaultException: Could not send Message.
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:199)
at $Proxy52.getStudentData(Unknown Source)
at uk.co.txttools.rm.service.RmServiceImpl.runRmJob(RmServiceImpl.java:209)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at $Proxy12.runRmJob(Unknown Source)
at uk.co.txttools.rm.quartz.RmJob.execute(RmJob.java:41)
at org.quartz.core.JobRunShell.run(JobRunShell.java:216)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:549)
Caused by: org.apache.cxf.interceptor.Fault: Could not send Message.
at org.apache.cxf.interceptor.MessageSenderInterceptor.handleMessage(MessageSenderInterceptor.java:48)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:220)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:296)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:242)
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:178)
... 16 more
Caused by: java.io.IOException: Illegal Protocol https for HTTP URLConnection Factory.
at org.apache.cxf.transport.http.HttpURLConnectionFactoryImpl.createConnection(HttpURLConnectionFactoryImpl.java:44)
at org.apache.cxf.transport.http.HTTPConduit.prepare(HTTPConduit.java:480)
at org.apache.cxf.interceptor.MessageSenderInterceptor.handleMessage(MessageSenderInterceptor.java:46)
答案 0 :(得分:1)
我发现的解决方案远非理想,但似乎有效。如果您有更好的解决方案,请在此处发布。
问题是在wsdl文件中,端点是http。发生错误是因为我将端点更改为https。 (可能这是一个错误?)
为了解决这个问题,我使用的是本地版本的wsdl文件,并输入两个端点,一个http和一个https。然后,当我更改端点时,我要么更改http一个,要么更改https一个,具体取决于我是想要http还是https。
答案 1 :(得分:0)
当我收到此消息时,我发现我没有为我的TLS客户端(WS)设置SSL上下文。
如果代码可以提供任何帮助:
/**
* Configure mutal TLS on WS given in parameter
*
* @param portType webservice
* @throws Exception
*/
public static void setTLS(Object ws) throws Exception {
if (tlsClientParameters == null) {
if (StringUtils.hasLength(ConfigUtils.getInstance().getProxyHost()) && StringUtils.hasLength(ConfigUtils.getInstance().getProxyPort())) {
System.setProperty("https.proxyHost", ConfigUtils.getInstance().getProxyHost());
System.setProperty("https.proxyPort", ConfigUtils.getInstance().getProxyPort());
}
X509Certificate[] certificatesChain = new X509Certificate[1];
KeyManager[] managers = new KeyManager[1];
Pkcs12 pkcs12 = new Pkcs12();
pkcs12.login(new ClassPathResource(ConfigUtils.getInstance().getCertificateFileName()).getURI().getPath(), ConfigUtils.getInstance().getCertificatePassword());
certificatesChain[0] = pkcs12.getCertificate();
managers[0] = new SSLKeyManagers(certificatesChain, pkcs12.getKey());
Client client = ClientProxy.getClient(portType);
SSLContext sslContext = SSLContext.getInstance("TLS");
TrustManager[] trustManager = getServerTrustManager();
sslContext.init(managers, trustManager, null);
HTTPConduit conduit = (HTTPConduit) client.getConduit();
tlsClientParameters = new TLSClientParameters();
if (trustManager != null) {
tlsClientParameters.setTrustManagers(trustManager);
}
tlsClientParameters.setKeyManagers(managers);
tlsClientParameters.setSSLSocketFactory(sslContext.getSocketFactory());
tlsClientParameters.setDisableCNCheck(false);
conduit.setTlsClientParameters(tlsClientParameters);
} else {
Client client = ClientProxy.getClient(portType);
HTTPConduit conduit = (HTTPConduit) client.getConduit();
conduit.setTlsClientParameters(tlsClientParameters);
}
}
/**
*
* Gets the trust manager
*
* @return keystore
* @throws NoSuchAlgorithmException
* @throws KeyStoreException
* @throws ResourceException
* @throws IOException
* @throws CertificateException
*/
private static TrustManager[] getServerTrustManager() throws NoSuchAlgorithmException, KeyStoreException, CertificateException, IOException, ResourceException {
TrustManagerFactory factory = TrustManagerFactory.getInstance("X.509");
KeyStore trustStore = KeyStore.getInstance("JKS");
trustStore.load(new ClassPathResource(ConfigUtils.getInstance().getServerKeyStoreFileName()).getInputStream(), ConfigUtils.getInstance().getServerKeystorePassword().toCharArray());
factory.init(trustStore);
return factory.getTrustManagers();
}