2

jax-ws を使用してロード バランサー上にある Web サービスを呼び出すと、返される

サーバーが HTTP ステータス コード 302 を送信しました: 一時的に移動しました

その後失敗しますが、SoapUI を使用すると正常に動作します。

これを正しく処理するようにサービスを構成する方法はありますか?

を使用してWebサービスコードを生成し、wsimportそのように呼び出します

NotificationWebService service = new NotificationWebService(wsdlLocation, qName);
NotificationWebServiceSoap serviceSoap = service.getNotificationWebServiceSoap();
String xmlString = serviceSoap.getRSAPublicKeyXMLString();

私は立ち往生しており、どこにも解決策を見つけることができなかったので、助けていただければ幸いです。

4

3 に答える 3

17

そのため、多くの調査の後、最終的に問題が何であるかを突き止めました。http から https へのリダイレクトが原因でした。Web で見つけた記事 (もう URL を思い出せません) によると、wsdl2javaおよびwsimportスタブ ジェネレーターが Web サービス通信を行うために使用するライブラリは、セキュリティ上の理由により、http から https へのリダイレクトに従うことを許可していません。

したがって、https wsdlの場所からスタブを生成していたとしても. https://wsdl.location.com?wsdl 、Web サービス呼び出しを行うコードを実行したとき、 http: //wsdl.location.com への呼び出しを試みていたため、https:/へのリダイレクト要求が発生しました。 /wsdl.location.com ですが、http ライブラリではそれが許可されていません。したがって、例外として 302 http コードを転送するだけです。

また、2 つの Web サービス URL があります。1 つは、通常の http url であるテスト サービスであり、https を介した運用サーバーがあります。したがって、これを回避するには、BindingProviderクラスを使用して、指定したエンドポイント (現在は https アドレス) を使用するようにサービスをオンザフライで構成するだけです。これにより、呼び出す環境に応じてその場で指定することもできます。つまり、テスト URL を使用するか、実動 URL を使用するかです。

NotificationWebService service = new NotificationWebService();
NotificationWebServiceSoap serviceSoap = service.getNotificationWebServiceSoap();

BindingProvider bindingProvider = (BindingProvider) serviceSoap;
bindingProvider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "https://wsdl.location.com");

String xmlString = serviceSoap.getRSAPublicKeyXMLString();

つまり、誰かがこの問題に遭遇した場合。ポイントする必要があるエンドポイントが https 上にあるかどうか、https リダイレクトを要求する http 呼び出しではなく、直接の https 呼び出しを行っていることを確認してください。これは、デバッグ中にserviceSoapを調べることで確認できます。呼び出し元の URL が示されます。

スタブを生成するようにwsdl2javawsimportを構成し、スタブが https 呼び出しを使用するように強制するオプションを調べたり、使用したりしませんでした。これにより、さまざまな環境に複数の URL エンドポイントを構成できるようになりました。

于 2012-12-06T15:36:28.163 に答える
0

はい。トランスポートに何を使用しているかはわかりませんでしたが、HttpClient のようなものであれば、リダイレクトに従うように設定する必要があります。自動生成されたコードをいじる必要があるかもしれませんし、代わりに、Spring Web Services や CXF などのより高いレベルの抽象化を試す必要があるかもしれません。

于 2012-12-04T11:48:25.547 に答える