■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 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. 不許無断複製 |