■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                      2009年05月03日

    Java総合講座 - 初心者から達人へのパスポート
                  vol.151

                                セルゲイ・ランダウ
 バックナンバー: http://www.flsi.co.jp/Java_text/
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■


[このメールマガジンは、画面を最大化して見てください。]


========================================================
◆ 01.SOAPのアプリケーション(Webサービス)
========================================================


さて、前回のようにassertのコードを

assert numOfNights > 0 && numOfLodgers > 0;

のように1つの文にまとめてしまうと、AssertionErrorが発生しても、
numOfNightsのほうが条件を満たしていなかったのか、それともnumOfLodgers
のほうが条件を満たしていなかったのか、どちらなのか区別がつきません。

そのような場合には、たとえば

assert numOfNights > 0 && numOfLodgers > 0 : "numOfNights = " + numOfNights +
     "numOfLodgers = " + numOfLodgers;

のようにしてやると、コロン(:)以下の部分がAssertionErrorに詳細メッセージ
として書き込まれます。(したがって、コロン(:)以下の部分は文字列もしくは
(一般のオブジェクトの場合はtoString()メソッドの実行によって)文字列表現
可能なものでなければなりません。)
なお、AssertionErrorの詳細メッセージを取り出すにはgetMessage()というメソッド
を呼び出します。

たとえば、前回のAssertTestクラスを

--------------------------------------------------------
public class AssertTest {

public static void main(String[] args) {
    try {
       AssertTest test = new AssertTest();
       test.warikan(5, 0);
    } catch (AssertionError e) {
        System.out.println("Precondition failure: " + e.getMessage());
    }
}

   public int warikan(int numOfNights, int numOfLodgers) throws AssertionError {
      assert numOfNights > 0 && numOfLodgers > 0 : "numOfNights = " + numOfNights +
           ", numOfLodgers = " + numOfLodgers;
      return numOfNights * 50000 / numOfLodgers;
   }

}
--------------------------------------------------------

のように書き換えてやると、標準出力(コンソール)に

Precondition failure: numOfNights = 5, numOfLodgers = 0

というメッセージが書き出されることになり、どちらの引数が条件を満たしていなかった
のか調べることが可能になります。

これでもまだ分かりにくいという人は、さらに、たとえば

assert numOfNights > 0 : "numOfNights (= " + numOfNights + ") <= 0";
assert numOfLodgers > 0 : "numOfLodgers (= " + numOfLodgers + ") <= 0";

というようなassert文にしてやれば、numOfNights > 0でない場合と
numOfNights > 0ではあるがnumOfLodgers > 0ではない場合が区別できますね。

ここらへんは、プログラムを書く人が工夫しましょう。



さて、現在作成しているWebサービスでassertを使用するとき(というより
AssertionErrorを捉えるとき)に注意しなければならないことは、Webサービスのメソッド
を呼び出している側(つまりクライアント)に対して、呼び出されるメソッド
(Webサービス)が直接AssertionErrorを投げることができないということです。

この場合どうしたらいいかというと、Webサービスのメソッドからクライアントへは
RemoteExceptionという例外を投げることができるので、AssertionErrorをいったん
RemoteExceptionに変換してから投げます。

たとえば、次のようなソース・コードになります。

--------------------------------------------------------
           ・
           ・
           ・
public class HotelSoapBindingImpl implements Hotel{
  
   private static Logger logger = Logger.getLogger(HotelSoapBindingImpl.class);
  
   public RoomInfo[] findRooms(StayInfoInput stayInfo) throws RemoteException {
      logger.info("Start ...............");
      Vector<RoomInfo> roomInfoVector = null;

      try {
         String startDate = stayInfo.getStartDate();
           ・
           ・
           ・
         assert Pattern.matches("2[0-9]{3}[0-1][0-9][0-3][0-9]", startDate) : "startDate (= " + startDate + ") not correct.";
           ・
           ・
           ・
      } catch (AssertionError e) {
         throw new RemoteException("AssertionError occured", e);
      }
           ・
           ・
           ・
      return roomInfoVector.toArray(new RoomInfo[roomInfoVector.size()]);
   }
           ・
           ・
           ・
--------------------------------------------------------

つまり、tryブロックの中でassert文を入れておき、catch (AssertionError e)のブロック
でAssertionErrorを捉えて、そのブロックの中でRemoteExceptionに作り変える訳です。

さて、この場合、実行時オプションの

-enableassertions
または
-ea

をどこに指定するかというと、Tomcatに設定する必要があります。

Windows用のTomcatとUNIXやLinux用のTomcatでは設定する場所が違いますが、とりあえず
現在使用しているWindows上のTomcatでの設定方法を説明しておきます。

まず、「スタート」ボタン→「すべてのプログラム」→「Apache Tomcat 6.0」→「Configure Tomcat」
を選択し(ただし、Tomcat起動中はこの機能は使用できませんので、Tomcatを起動していない
状態で行うこと)、「Apache Tomcat Properties」ウインドウの「Java」タブをクリックします。
そして、「Java Options:」欄の中(の一番下の行)に

-enableassertions

と入力し、「適用」ボタンと「OK」ボタンをクリックします。



(次回に続く)


では、今日はここまでにします。



┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
★ホームページ:
      http://www.flsi.co.jp/Java_text/
★このメールマガジンは
     「まぐまぐ(http://www.mag2.com)」
 を利用して発行しています。
★バックナンバーは
      http://www.flsi.co.jp/Java_text/
 にあります。
★このメールマガジンの登録/解除は下記Webページでできます。
      http://www.mag2.com/m/0000193915.html
★このメールマガジンへの質問は下記Webページにて受け付けて
 います。わからない所がありましたら、どしどしと質問をお寄
 せください。
      http://www.flsi.co.jp/Java_text/
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Copyright (C) 2009 Future Lifestyle Inc. 不許無断複製