How to use maru-dog Beanプロパティデータバインドライブラリ (6)

前回から少し時間が空きましたが、今回はMap型のインスタンスに格納されているデータをBeanの各プロパティにバインドする機能を紹介します。

Map型のデータをバインドする場合にもアノテーションベースによるバインドと、フィールド名によるバインドの2種類を選択することが可能です。

それでは、まずアノテーションベースによるバインドのコードサンプルを示します。

import java.util.HashMap;
import java.util.Map;

import org.maru.dog.Director;
import org.maru.dog.Marudog;
import org.maru.dog.annotation.Bound;

public class Main {

    public static void main(String[] args) {
        Director director = Marudog.getDirector();

        UserBean user = new UserBean();

        director.bind(user, getUserMap());
        System.out.println(user);

    }


    private static Map<String, Object> getUserMap() {
        Map<String, Object> user = createMap();
        user.put("userId", "ABC123");
        user.put("password", "PASSWORD");
        user.put("date", "2011/07/07");
        user.put("address", "Tokyo/Japan");
        user.put("age", (short)25);
        user.put("gender", 1);
        user.put("name", "Marudog");
        user.put("nickName", "dog");
        return user;
    }

    private static <K, V> Map<K, V> createMap() {
        return new HashMap<K, V>();
    }

    static class UserBean {

        @Bound
        private String userId;

        @Bound(name = "name")
        private String userName;

        @Bound
        private String address;

        @Bound
        private short age;

        private String gender;

        @Bound(name = "birthday")
        private String date;

        @Override
        public String toString() {
            return "UserBean [userId=" + userId + ", userName=" + userName
                    + ", address=" + address + ", age=" + age + ", gender="
                    + gender + ", date=" + date + "]";
        }

    }
}

上記サンプルコードの実行結果は次のようになります。

UserBean [userId=ABC123, userName=Marudog, address=Tokyo/Japan, age=25, gender=null, date=null]

getUserMapメソッドでユーザ情報を格納したMap型のインスタンスを生成し、mainメソッド内のdirector.bind(user, getUserMap())でUserBeanのインスタンスにバインドを行います。

Map型のデータをバインドする際には、Mapのキーは必ずString型でなければなりません。

UserBeanのバインドされるターゲットを識別するために@Boundアノテーションが付与されています。@Boundアノテーションが付与された項目のネーミングルールは普通のBean同士のバインド時と同じです。

上記サンプルの実行結果ではgenderとdateプロパティがnullとなっています。

まずgenderについては@BoundアノテーションがUserBeanに付与されていないためバインド対象外として扱われます。次にdateは@Boundアノテーションでバインド名を"birthDay"と設定していますが、Map型のインスタンスに保存されているキー:バリューの組み合わせで、brithDayがキーとなるデータが存在しないためバインドが行われていません。

それでは、フィールド名によるバインドのサンプルを示します。

import java.util.HashMap;
import java.util.Map;

import org.maru.dog.Director;
import org.maru.dog.Marudog;

public class Main {

    public static void main(String[] args) {
        Director director = Marudog.getDirector();

        UserBean user = new UserBean();

        director.bindByFieldName(user, getUserMap());
        System.out.println(user);

    }


    private static Map<String, Object> getUserMap() {
        Map<String, Object> user = createMap();
        user.put("userId", "ABC123");
        user.put("password", "PASSWORD");
        user.put("birthDay", "2011/07/07");
        user.put("address", "Tokyo/Japan");
        user.put("age", (short)25);
        user.put("gender", "man");
        user.put("userName", "Marudog");
        user.put("nickName", "dog");
        return user;
    }

    private static <K, V> Map<K, V> createMap() {
        return new HashMap<K, V>();
    }

    static class UserBean {

        private String userId;

        private String userName;

        private String address;

        private short age;

        private String gender;

        private String date;

        @Override
        public String toString() {
            return "UserBean [userId=" + userId + ", userName=" + userName
                    + ", address=" + address + ", age=" + age + ", gender="
                    + gender + ", date=" + date + "]";
        }

    }

}

このサンプルプログラムの実行結果は次のようになります。

UserBean [userId=ABC123, userName=Marudog, address=Tokyo/Japan, age=25, gender=man, date=null]

UserBeanには一切バインドターゲットを示す@Boundアノテーションが付与されていません。

director.bindByFieldName(user, getUserMap())でバインド処理を行うわけですが、ターゲットの識別はフィールド名で識別します。

実行結果をみるとdateがnullと出力されていますが、これはMap型のインスタンスに保存されているキー:バリューの組み合わせで、dateがキーとなるデータが存在しないためバインドが行われていません。

今回はここまでとします。

ちなみにこれまでのサンプルはいずれもアノテーションをフィールドに付与していましたが、@Boundであればsetterメソッドに、@Bindであればgetterメソッドに付与することが可能です。その際いずれもアノテーションの"name"を設定していない場合はメソッド名の"set" or "get"を除き、最初の一文字目を小文字にしたものがバインド時の識別子となります。

例:

@Bind
public String getUserName() {
    return userName;
}

上記例の場合、バインドの識別子は"userName"です。

いずれにせよmaru-dogを利用すればこれまでいちいちアクセッサーメソッドでデータを代入していた冗長な処理を簡素化できます。

プロジェクトサイト:http://maru.sourceforge.jp/
ドキュメントサイト:http://maru.sourceforge.jp/document_dog.html
ダウンロードサイト:http://sourceforge.jp/projects/maru/releases/