Java

Commons BeanUtils

インストール

maven

mavenでインストールする場合は、以下のような指定となる。

  1. <dependency>
  2.     <groupId>commons-beanutils</groupId>
  3.     <artifactId>commons-beanutils</artifactId>
  4.     <version>1.9.3</version>
  5. </dependency>

参考MvnRepository - on https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils

個別にjarを設置する

jarファイルを個別にインストールする場合、1.9.3では以下のようになる。

commons-loggingやcommons-collectionsが必要となる。commons-collectionsは、4からgroupとartifactが変更されているので注意する。1.9.3では、commons-collectionsを利用する。

DynaBean、DynaClass、DynaProperty

これらのクラスは、BeanのようなJavaオブジェクトを表現するためのベースクラス達である。
それぞれ以下の役割を持つ。

LazyDynaList

このクラスは、ArrayList<Object>を継承したクラスであり、主に以下の機能を有する。

  1. サイズを自動拡張してくれ、指定のpositionに要素を挿入することができる。
  2. 配列やCollectionをLazyDynaListに挿入する。指定の位置にCollectionの要素を挿入することができる。

LazyDynaListの要素の型

LazyDynaListに格納されるオブジェクトは、DynaBeanクラスとして管理される。
追加されるオブジェクトの型によって異なる。

対応する型
MapLazyDynaMap
POJOWrapDynaBean
DynaBeanDynaBean

要素タイプの指定がない場合は、LazyDynaBeantとLazyDynaClassが使われる。

Map型を扱う

/*
 * 1. Mapの配列を扱う
 */
System.out.println("[1]");

// Mapの配列を作成
HashMap[] myMapArray = new HashMap[1];
myMapArray[0] = new HashMap<String, Object>();
myMapArray[0].put("name", "mapValue");
// Mapの配列を追加して初期化
LazyDynaList lazyList = new LazyDynaList(myMapArray);
// リサイズ時に失敗しないように要素のタイプを指定しておく。
// この指定がないと、すでに要素がある状態でelementTypeを設定しようとしてエラーとなる。(この時点では、まだelementTypeがない)
// DynaClassはLazyDynaMapであり、このDynaClassはMap型のオブジェクトを生成して返す。
lazyList.setElementType(HashMap.class);
//lazyList.setElementType(TreeMap.class);

// サイズ拡張で、新しい要素オブジェクトを得る、LazyDynaMap型である。
DynaBean newElement = (DynaBean) lazyList.get(lazyList.size());
newElement.set("name", "arrayValue");
DynaBean element = (DynaBean) lazyList.get(lazyList.size() - 1);
System.out.println(element.get("name"));

Map<String, String>[] maps = (Map<String, String>[]) lazyList.toArray();
Arrays.stream(maps).forEach(m -> {
    m.forEach((k, v) -> System.out.println(k + ":" + v));
});


/*
 * 2. Listを扱う
 */
System.out.println("[2]");

List<Map<String, String>> myList = new ArrayList<>();
lazyList = new LazyDynaList(myList);
// サイズ拡張, elementTypeはLazyDynaBeanである
newElement = (DynaBean) lazyList.get(lazyList.size());
newElement.set("name", "listValue");
element = (DynaBean) lazyList.get(lazyList.size() - 1);
// この時点でelementTypeはLazyDynaBeanとなっている。
System.out.println(element.get("name"));

// elementTypeのオブジェクトを追加する。
LazyDynaBean newBean = new LazyDynaBean();
newBean.set("name", "elementValue");
lazyList.add(newBean);
element = (DynaBean) lazyList.get(lazyList.size() - 1);
System.out.println(element.get("name"));

// LazyDynaBeanでない型の追加はエラーとなる。
HashMap<String, Object> map = new HashMap<String, Object>();
lazyList.add(map);
// Exception in thread "main" java.lang.IllegalArgumentException: Element Type class java.util.HashMap doesn't match other elements class org.apache.commons.beanutils.LazyDynaBean

/*
[1]
arrayValue
name:mapValue
name:arrayValue
[2]
listValue
elementValue
Exception in thread "main" java.lang.IllegalArgumentException: Element Type class java.util.HashMap doesn't match other elements class org.apache.commons.beanutils.LazyDynaBean
	at org.apache.commons.beanutils.LazyDynaList.transform(LazyDynaList.java:689)
	at org.apache.commons.beanutils.LazyDynaList.add(LazyDynaList.java:288)
	at cb.LazyDynaListSample.main(LazyDynaListSample.java:122)
*/

この機能は、例えばHTMLフォームから要素の配列を受け取り、Listにセットするような状況で役に立つ。
例えば以下のような使い方ができるだろう。

HTMLフォーム配列を受け取る例

  1. package cb;
  2.  
  3. import java.io.Serializable;
  4. import java.lang.reflect.InvocationTargetException;
  5. import java.util.Arrays;
  6. import java.util.HashMap;
  7.  
  8. import org.apache.commons.beanutils.BeanUtils;
  9. import org.apache.commons.beanutils.LazyDynaList;
  10. import org.apache.commons.beanutils.WrapDynaBean;
  11.  
  12. public class LazyDynaListTest {
  13.  
  14.     public static class MyBean implements Serializable {
  15.         private String name;
  16.         private int age;
  17.  
  18.         public String getName() {
  19.             return name;
  20.         }
  21.  
  22.         public void setName(String name) {
  23.             this.name = name;
  24.         }
  25.  
  26.         public int getAge() {
  27.             return age;
  28.         }
  29.  
  30.         public void setAge(int age) {
  31.             this.age = age;
  32.         }
  33.  
  34.         @Override
  35.         public String toString() {
  36.             return String.format("name:%s, age:%d", name, age);
  37.         }
  38.     }
  39.  
  40.     public static class MyForm {
  41.         LazyDynaList list = new LazyDynaList(MyBean.class);
  42.  
  43.         public LazyDynaList getList() {
  44.             return list;
  45.         }
  46.  
  47.         public void setList(LazyDynaList list) {
  48.             this.list = list;
  49.         }
  50.  
  51.         public void bind(HashMap<String, Object> parameters)
  52.                 throws IllegalAccessException, InvocationTargetException {
  53.             BeanUtils.populate(this, parameters);
  54.         }
  55.     }
  56.  
  57.     public static void main(String[] args) throws Exception {
  58.         MyForm form = new MyForm();
  59.  
  60.         HashMap<String, Object> parameters = new HashMap<String, Object>() {
  61.             {
  62.                 put("list[0].name", "hoge");
  63.                 put("list[0].age", 100);
  64.  
  65.                 put("list[1].name", "foo");
  66.                 put("list[1].age", 200);
  67.             }
  68.         };
  69.  
  70.         form.bind(parameters);
  71.  
  72.         // POJOは、WrapDynaBeanとして格納されている。
  73.         Arrays.stream(form.getList().toArray(new WrapDynaBean[0]))
  74.                 .forEach(v -> {
  75.                     // instanceメンバにMyBeanのインスタンスがある。
  76.                     MyBean bean = (MyBean)v.getInstance();
  77.                     System.out.println(String.format("name: %s, age: %d",
  78.                             bean.getName(), bean.getAge()));
  79.                     // DynaBeanからアクセスする場合は、プロパティ名を指定すれば良い。
  80.                     System.out.println(String.format("name: %s, age: %d",
  81.                             v.get("name"), v.get("age")));
  82.                 });
  83.     }
  84. }

参考 Maven Repository

参考リンク


トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
目次
ダブルクリックで閉じるTOP | 閉じる
GO TO TOP