使用HTTPS的Web服务

我有一个外部Web服务,它可以通过https工作,我可以使用wsimport生成java类但是当我调用服务时我会收到以下exception:

Exception in thread "main" com.sun.xml.internal.ws.client.ClientTransportException: HTTP transport error: java.net.UnknownHostException: ECM01 at com.sun.xml.internal.ws.transport.http.client.HttpClientTransport.getOutput(Unknown Source) at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.process(Unknown Source) at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.processRequest(Unknown Source)... Caused by: java.net.UnknownHostException: ECM01 at java.net.PlainSocketImpl.connect(Unknown Source) at java.net.SocksSocketImpl.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at sun.net.NetworkClient.doConnect(Unknown Source) 

我调用服务的类是这样的:

 public static void main(String[] args) { ColleagueServiceService cs = new ColleagueServiceService(); ColleagueService service = cs.getColleagueServicePort(); try { service.getColleagues("user", "password", 1); } catch (Exception_Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } 

我尝试使用SoapUI来调用webservice,但它显示了另一个exception:

 Tue Dec 18 09:40:06 BRST 2012:ERROR:org.apache.http.conn.HttpHostConnectException: Connection to https://my.webservice.url.com refused org.apache.http.conn.HttpHostConnectException: Connection to https://my.webservice.url.com refused at com.eviware.soapui.impl.wsdl.support.http.SoapUIMultiThreadedHttpConnectionManager$SoapUIClientConnectionOperator.openConnection(SoapUIMultiThreadedHttpConnectionManager.java:321) at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149) at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121) at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:561) at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:415) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754) at com.eviware.soapui.impl.wsdl.support.http.HttpClientSupport$Helper.execute(HttpClientSupport.java:236) at com.eviware.soapui.impl.wsdl.support.http.HttpClientSupport.execute(HttpClientSupport.java:345) at com.eviware.soapui.impl.wsdl.submit.transports.http.HttpClientRequestTransport.sendRequest(HttpClientRequestTransport.java:241) at com.eviware.soapui.impl.wsdl.WsdlSubmit.run(WsdlSubmit.java:123) at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)... Caused by: java.net.ConnectException: Connection timed out: connect at java.net.DualStackPlainSocketImpl.connect0(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) at java.net.AbstractPlainSocketImpl.connect(Unknown Source) at java.net.PlainSocketImpl.connect(Unknown Source)... 

编辑:

这个web服务是我的,但是它在外部服务器中,我看到我的类ColleagueService(不是我做了)它的注释:

 @WebService(serviceName="ColleagueServiceService") @SOAPBinding(style = SOAPBinding.Style.RPC, use = SOAPBinding.Use.LITERAL, parameterStyle = SOAPBinding.ParameterStyle.WRAPPED) public class ColleagueService { 

生成的wsdl我是这样的:

    

外部服务器(客户端)有一个jboss服务器和一个apache http服务器,http服务器通过ProxyPass将所有请求重定向到路径/ services /到jboss服务器(jboss服务器是主机ECM01),无论如何wsdl是错误的,因为服务是https,在wsdl我是http

有人可以帮忙吗? 谢谢。

引起:java.net.UnknownHostException:ECM01

这是WSDL中指定的主机吗? 寻找这样的部分:

    

如果是这样,您将必须在端口上设置端点 :

 BindingProvider bindingProvider = (BindingProvider) port; bindingProvider.getRequestContext() .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpoint); 

此外还有其他任务,如提供代理配置,如Anders R. Bystrup提及和(可能) 配置SSL客户端证书 。


WSDL不反映真实的服务端点是完全正常的。 在我工作的任何地方,都使用了一个已知的错误URI(例如localhost,其中所有内容都分布在不同的主机上。)客户端可以通过配置机制显式设置端点(请参阅上面的JAX-WS客户端代码。)这样可以实现灵活性在开发期间,防止在从开发到生产的暂存期间使用错误的主机。

也就是说,当使用自动生成的WSDL时,我认为生成SOAP地址元素的方式是JAX-WS实现的实现细节。 我不确定,因为我从来没有依赖它。 我会参考容器实现的文档。