7

私は外部 Web サービスを持っています。https 経由で動作します。wsimport を使用して Java クラスを生成できますが、サービスを呼び出すと、次の例外が発生します。

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 を使用して Web サービスを呼び出そうとしましたが、別の例外が表示されます。

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 私はこれを持っています:

<port binding="tns:ColleagueServiceBinding" name="ColleagueServicePort">
    <soap:address location="http://ECM01:80/services/ColleagueService"/>
</port>

外部サーバー (クライアント) には jboss サーバーと apache http サーバーがあり、http サーバーは ProxyPass によるパス /services/ のすべてのリクエストを jboss サーバーにリダイレクトします (jboss サーバーはホスト ECM01 です)。はhttpsであり、wsdlではhttpを使用しています

誰でも助けることができますか?ありがとうございました。

4

1 に答える 1

9

原因: java.net.UnknownHostException: ECM01

これは WSDL で指定されたホストですか? 次のようなセクションを探します。

<wsdl:port binding="tns:FooBinding" name="FooPort">
  <soap:address location="https://ECM01/FooService"/>
</wsdl:port>

その場合、ポートにエンドポイントを設定する必要があります。

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 実装の実装の詳細であると思います頼ったことがないので定かではありません。コンテナ実装のドキュメントを参照します。

于 2012-12-18T13:57:31.253 に答える