0

私はSOAP Webサービス用のクライアントを構築しています。私はWSDLからJaxWS Webサービスクライアントを構築するように指示して、クライアントコードのほとんどをIntelliJ IDEAで自動生成しました。JaxWS:基本認証を使用したWebサービス

ウェブサービスはさまざまなURL(テスト、統合、制作)で動作するため、クライアントでサービスURLを設定できる必要があります。私のコードは次のようになります:

String urlString = props.getProperty(URL); 
service = new RequestMultiTransportService(new URL(urlString), 
       new QName("http://some.uri.com/", 
         "RequestMultiTransportService")); 
Boolean useBasicAuth = Boolean.parseBoolean(props.getProperty(BASICAUTH)); 
RequestMultiTransport rmt = service.getRequestMultiTransportPort(); 
if (useBasicAuth) { 
    String user = props.getProperty(AUTHUSER); 
    String pw = props.getProperty(AUTHPW); 
    Map requestContext = ((BindingProvider)rmt).getRequestContext(); 
    requestContext.put(BindingProvider.USERNAME_PROPERTY, user); 
    requestContext.put(BindingProvider.PASSWORD_PROPERTY, pw); 
} 
ProvisioningResponse response = rmt.send("some", "params", "..."); 

ご覧のとおり、サービスには基本認証が必要な場合があります。実際のリクエストに対して基本認証を設定することはできますが、WSDLファイル(コンストラクタRequestMultiTransportServiceで行われます)のロード用に設定することはできません。 RequestMultiTransportServiceはIDEAによって自動生成され、コンストラクタはスーパーコンストラクタを呼び出すだけで、javax.xml.ws.Serviceの1つです。

Webサービスに基本認証が必要な場合は、urlStringにあるWSDLファイルを取得するためのユーザー/パスワードが提供されないため、コードが失敗します。 WSDLファイルをローカルに保存し、URLにfile://というURLを指定することで、考えられる回避策が考えられました。しかし、WSDLファイルで定義されているサービスロケーションが異なり、WSDLファイルからロードされたserviceオブジェクトのサービスURLを変更できないように見えるため、これは私の要件を満たしません。

基本認証でWSDLファイルを取得するソリューションはありますか?

+1

JAX-WSはバグのように見えません(最も関連性の高いものは[JAX_WS-1]です(http://java.net/jira/browse/JAX_WS-1?focusedCommentId= 15246#action_15246))。 JAX-WSは終わりにURLConnectionを使用するので、回避策は[Authenticator'](http://stackoverflow.com/a/496707/267197)を使用することです。 –

+0

これが可能かもしれませんが、回避策はグローバルプロパティを設定し、同じ環境で実行される他のサービスを妨害する可能性があるという問題があります。 – flyx

+0

JAX-WSのバグを起こすだけです。おそらくこれはあなたができる最高のものです。 –

答えて

0

WebServiceClientに新しいコンストラクタを作成し、そのユーザ名、パスワード、およびエンドポイントの場所(パラメータ)をパラメータとして渡します。この後にrequestContextに

requestContext.put(BindingProvider.USERNAME_PROPERTY, user); 
requestContext.put(BindingProvider.PASSWORD_PROPERTY, pw); 
requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointUrl); 

を入れて、defaultConstructorにアクセスしないようにしてください。

+3

コンストラクタでrequestContextにアクセスするにはどうすればよいですか?私は 'super.getPort()'を呼び出す必要はないでしょうか(初期化が完了していないと思います)?スーパーコンストラクタを呼び出さないと、クライアントがWSDLファイルをまったくロードしないということはありませんか? – flyx

関連する問題