読者です 読者をやめる 読者になる 読者になる

/dev/null

(◞‸◟)

Velocityにオブジェクトの中身を表示するメソッドを追加する

Apache Velocityというものがあります。

http://velocity.apache.org/

JavaなWebアプリケーションでサーバーから返されたデータを表示したりするときに大変便利なテンプレートエンジンみたいなもんですね。

たとえばサーバーからHogeResponseというものが返された時にhtml側で

$!{hogeResponse.accountId}

とか書くと返ってきたオブジェクトのaccountIdフィールドの中身が表示されます。

ifやforeachやなどの制御構文もあるのでひと通りの処理をhtml側で書けて良いです。

http://brokendish.org/ubuntu/825/

で、本題。

まあ基本的にサーバーから返す値って結構複雑で

class ResponseData {
 private UserInfoData userInfoData;
 private FriendData friendData;
 private HogeData hogeData;
}

こんな感じ(getter/setterは省略)

でそれぞれ

class UserInfoData {
 private int accountId;
 private String name;
}


class FriendData {
 private int accountId;
 private String name;
 private TimeStamp lastLoginTime;
}


class HogeData {
 private List<Integer> hogehogeDataList;
}

みたいな。

で、デバッグとかするときは基本デバッガ使って値の確認とか、そもそもテスト書いてるとかあるけど、html側で返ってきた値をひと通り表示出来たほうが捗ることもあるわけで(毎回デバッガもだるいし)

仮組みとかしてるときね。

そういう場合は

$!{responseData.userInfo.accountId}

$!{responseData.userInfo.name}

$!{responseData.friendData.accountId}

$!{responseData.friendData.name}

$!{responseData.friendData.lastLoginTime}

#foreach ($!obj in $!{responseData.hogeData.hogehogeDataList})
 $!{obj}

#end

って書くわけで超めんどくさい

そこでVelocityのタグを拡張して追加します。

まずvelocity-toolbox.xmlを開いてディレクティブの中に

<tool>
        <key>debug</key>
        <scope>request</scope>
        <class>com.hoge.DebugReflectTool</class>
</tool>

とか書きます。

class名は適当に。

で、上で書いたパッケージにDubugReflectToolクラスを作成します。

クラスはこんな感じ

public class DebugReflectTool {

    /**
     * オブジェクトの中身を表示
     * 独自データクラスはto_stringを実装してね
     * @param object object
     * @return String
     */
    public String printObject(Object object) {
        return ReflectionToStringBuilder.toString(object);
    }
}

オブジェクトを渡されたらReflectionToStringBuilderクラスのtoStringを呼び出してStringを返します

ReflectionToStringBuilder.toStringはApacheCommonaLangに入ってるので使えるようにしておいてね。

このクラスのこのメソッドはオブジェクトのtoStringをめっちゃうまい事表示してくれるクラス(アバウト

http://javazuki.wiki.fc2.com/wiki/ReflectionToStringBuilder

普通だと

Person@182f0db

みたいに表示されるのが

Person@182f0db[name=John Doe,age=33,smoker=false]

みたいに分かりやすさ満点。toString実装が捗るなというやつ。;

なのでさっきのDataクラスのそれぞれにtoStringをオーバーライドしてあげて

html側で

`$debug.printObject($!{responseData}{

ってやるとデータの中身が一気に表示されるのでちょっとしたデバッグ時などに楽になります。;

com.hoge.ResponseData@182f0db[userInfoData=[accountId=3,name="テストさん] friendData=[accountId=2,name="フレンドさん",lastLoginTime="2013-21;21:21"] hogeDataList=hogeData[1,2,3]] 

まあこれはちゃんとデバッガ使えテストしろで済む話ですが、velocityでは好きにクラス書いて処理させてできるので表現の幅広がっていいですよ。というお話でした。