ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JAX-WS Webサービスの高度な機能のプログラミング
11g リリース1(10.3.5)
B61633-03
  目次へ移動
目次

前
 
次
 

13 動的プロキシ・クライアントの作成

動的プロキシ・クライアントを使用すると、Webサービス・クライアントがclientgenを使用せずに、サービス・エンドポイント・インタフェース(SEI)に基づいて実行時に動的にWebサービスを起動できます。

動的プロキシ・クライアントを作成する手順を次の表に示します。詳細は、javax.xml.ws.ServiceのJavadoc(http://download.oracle.com/javaee/5/api/javax/xml/ws/Service.html)を参照してください。

表13-1 動的プロキシ・クライアントの作成手順

#
手順 説明

1

javax.xml.ws.Serviceインスタンスの作成

Service.createメソッドを使用してServiceインスタンスを作成します。

サービス名と、必要に応じてWSDLドキュメントの格納場所を渡す必要があります。メソッドの詳細は次のとおりです。

public static Service create (QName serviceName) throws javax.xml.ws.WebServiceException {}
public static Service create (URL wsdlDocumentLocation, QName serviceName) throws javax.xml.ws.WebServiceException {}

例:

URL wsdlLocation = new URL("http://example.org/my.wsdl");
QName serviceName = new QName("http://example.org/sample", "MyService");
Service s = Service.create(wsdlLocation, serviceName);

使用方法に関するその他の情報は、「WSDLの場所を指定する際のその他の考慮事項」を参照してください。

2

プロキシ・スタブを作成します。

Service.getPortメソッドを使用してプロキシ・スタブを作成します。このスタブを使用すると、ターゲット・サービス・エンドポイント上の操作を呼び出すことができます。

サービス・エンドポイント・インタフェース(SEI)と、必要に応じてWSDLサービス記述内のポートの名前を渡す必要があります。メソッドの詳細は次のとおりです。

public <T> T getPort(QName portName, Class<T> serviceEndpointInterface) throws javax.xml.ws.WebServiceException {}
public <T> T getPort(Class<T> serviceEndpointInterface) throws javax.xml.ws.WebServiceException {}

例:

MyPort port = s.getPort(MyPort.class);

WSDLの場所を指定する際のその他の考慮事項

HTTPSを使用してWSDLからWebサービスを取得する際に、WebLogic Server SSL証明書のホスト名定義がピアHTTPSサーバーのホスト名と同一ではない場合、または次のいずれかではない場合には、ホスト名検証エラーが発生して処理が失敗します。

ホスト名検証エラーは次のとおりです。

EchoService service = new EchoService(https-wsdl, webservice-qName);
:
:
javax.xml.ws.WebServiceException: javax.net.ssl.SSLKeyException:  
Security:090504 Certificate chain received from host.company.com - 10.167.194.63
failed hostname verification check. Certificate contained {....} but
check expected host.company.com

推奨される回避策は、サービスを作成する際にHTTPSではなくHTTPを使用してWSDLからWebサービスを取得すること、そしてサービスの作成後に独自のホスト名検証コードを使用してホスト名を検証することです。

EchoService service = Service.create(http_wsdl, qname);
//get Port
EchoPort port = service.getPort(...);
//set self-defined hostname verifier
((BindingProvider) port).getRequestContext().put(
      com.sun.xml.ws.developer.JAXWSProperties.HOSTNAME_VERIFIER,
      new  MyHostNameVerifier());
/*
*/  

必要に応じて、バインディング・プロバイダ・プロパティを設定してホスト名検証を無視することもできます。

((BindingProvider) port).getRequestContext().put(
      BindingProviderProperties.HOSTNAME_VERIFICATION_PROPERTY,
      "true");

ただし、HTTPSを使用してWSDLからWebサービスを取得する必要がある場合は、いくつかの回避策が考えられます。

回避策として独自のホスト名検証を設定する場合のホスト名検証の例を次に示します。

public class MyHostnameVerifier implements HostnameVerifier {
    public boolean verify(String hostname, SSLSession session) {
            if (hostname.equals(“the host you want”))
          return true;
           else
               return false;
    }
}