最近、以前にやったことがある Web サービスを呼び出すクライアントに取り組んでいましたが、その過程でいくつかの問題が発生し、自分がまだ知識が不足していることに気づきました。
Web サービスのサーバー側では証明書認証が必要です。証明書は cer 形式で送信されています。Java keytool ツールを使用して証明書を抽出した後、Web サービスを呼び出すときに次のステートメントを実行します。
System.setProperty("javax.net.ssl.trustStore", "xxxx.truststore");
クライアントが証明書を持っていることをサーバーに伝えますが、今のところ問題はありません。
次に、axis2のwsdl2javaを使用してクライアントコードを生成しましたが、実行するとすぐに次のエラーが発生しました。
org.apache.axis2.AxisFault: [ISS.0088.9125] SOAP リクエストは SOAP メッセージ モデルに準拠していません
このエラーは、要求された SOAP メッセージの形式が間違っているため、SOAP 開発ドキュメントで見つかりました。ドキュメントのアドレスは次のとおりです。 http://documentation.softwareag.com/webmethods/wmsuite7/Developer/Guides/7-1-1_SOAP_Developers_Guide.pdf (89)ページ)
この時、相手からsoapリクエストのメッセージを送ってほしいと頼まれ、私はWebサービスを使ってサーバーとクライアントを書く段階でしたが、soapについては少ししか知りませんでした。インターネットで情報を探し、同僚に尋ね、長い間苦労した後、ようやくリクエストメッセージを見つけました。同僚が教えてくれた方法は、tcp モニターなどのツールを使用することですが、Web サービスは https 形式であるため、使用できません。その後、次のように、生成されたクライアント コードに SOAPEnvelope.toString() を入力して取得しました。
<?xml バージョン='1.0' エンコーディング='utf-8'?>
<soapenv:Envelope xmlns:soapenv=" http://schemas.xmlsoap.org/soap/envelope/ ">
<soapenv:本体>
<ns1:UPLGenerate xmlns:ns1=" http://www.alcatel-lucent.com/webService/WS_UPL ">
<オペレーションコード>1 </オペレーションコード>
<プラント>2 </プラント>
<QuoteNumber>3 </QuoteNumber>
<ユーザーID>4 </ユーザーID>
<IncludePriceType>5 </IncludePriceType>
</ns1:UPLGenerate>
</soapenv:ボディ>
</soapenv:エンベロープ>
実際、この問題の理由は、axis2 クライアントのデフォルトの転送エンコーディングがチャンク化されているため、SOAP リクエスト メッセージの本文の先頭と末尾に 2 つの数字が存在するためです。これをテストするには、tcpmon を使用します。 .net または他の一部のサーバーはこのモードをサポートしていません。次のようにコードで設定するだけです。
stub._getServiceClient().getOptions().setProperty(HTTPConstants.CHUNKED, false);
週末に会社の先輩に相談してアドバイスをいただきました。
これで実行に問題はないはずだと思いましたが、別の問題がありました。
スレッド「メイン」org.apache.axis2.AxisFault での例外: org.apache.axis2.databinding.ADBException: 予期しないサブ要素 xxxxResponse
org.apache.axis2.AxisFault.makeFault(AxisFault.java:430) で
この問題は 3 日間私を悩ませていました。インターネット上で wstx-asl-3.2.1.jar を使用するという情報がたくさんありましたが、すべて試してみましたが、少なくともうまくいきませんでした。私はこのエラーのせいではありません。私は非常に急いでいたので、手がかりがありませんでした。後で、スタブ内の org.apache.axiom.soap.SOAPEnvelope _returnEnv (_returnEnv.toString()) を出力してしまいました。 Webサービスがhttpsであるため、soapUIによって返される結果が異なることがわかり、tcpmonを使用すると、返された応答に次の要素が常に存在するわけではないが、定義されていないことがわかりました。 wsdl 定義に minOccurs="0" が記述されていない場合、この wsdl によって生成されたクライアント コードが取得されない場合は、当然エラーが報告されます。 minOccurs="0" を wsdl に設定し、クライアント コードを再生成してテストし、合格します。
最後のステップで、WebSphere にデプロイした後、Web サービス呼び出しの実行時にエラーが発生しました。
java.net.SocketException: 未接続のソケットが実装されていません
これは証明書の問題で、数日かかりましたが、この証明書の親証明書が見つからないため、使用された証明書も含めてすべての証明書が WebSphere で取得できませんでした。証明書の場合、唯一の方法は .cer ファイルをインポートすることです。問題の原因は証明書です。 ! !
遭遇した問題は面倒なものでしたが、その成果は小さくありませんでした。恥ずかしながら、以前は、axis を使用してサーバーを作成する方法しか知らなかったのです。次に、wsdlを使用してクライアントを生成します。wsdlを使用してサーバー側を生成できるかどうかはわかりません。幸いなことに、このような機会を与えていただき、私は進歩しており、皆さんが私を励ましてくださることができます。
-