1

Java Beanをハッシュマップに変換してから、後でハッシュマップをJavaBeanに変換しようとしています。Javaオブジェクトをハッシュマップに変換するために、この投稿は私を助けました。 commons-beans BeanUtilsを使用して、JavaBeanをネストされた名前のキー/値マップに変換します

以下のコード

    public class Ax {
    String axAttr;

    public String getAxAttr() {
        return axAttr;
    }

    public void setAxAttr(String axAttr) {
        this.axAttr = axAttr;
    }

    List<Bx> bxs;

    public List<Bx> getBxs() {
        return bxs;
    }

    public void setBxs(List<Bx> bxs) {
        this.bxs = bxs;
    }
}

public class Bx {
    String bxAttr;

    public String getBxAttr() {
        return bxAttr;
    }

    public void setBxAttr(String bxAttr) {
        this.bxAttr = bxAttr;
    }

    List<Cx> cxs = new ArrayList<Cx>();

    public List<Cx> getCxs() {
        return cxs;
    }

    public void setCxs(List<Cx> cxs) {
        this.cxs = cxs;
    }
}

public class Cx {
    String cxAttr;

    public String getCxAttr() {
        return cxAttr;
    }

    public void setCxAttr(String cxAttr) {
        this.cxAttr = cxAttr;
    }

    List<String> items;

    public List<String> getItems() {
        return items;
    }

    public void setItems(List<String> items) {
        this.items = items;
    }
}

以下は、に格納されているキーと値のペアです。HashMap

axAttr-> axString
bxs [0] .bxAttr-> bxString
bxs [0] .cxs [0] .cxAttr-> cxString
bxs [0] .cxs [0] .items[0]->1つの
bxs[ 0] .cxs [0] .items[1]->2つの
bxs[0].cxs [0] .items[2]->3つ

これらのキー値をに保存しDB、後でそれらを取得して、JavaBeanに再度変換したいと思います。しかし、私が得てHashMapいる助けを借りて同じものをJavaオブジェクトに変換するためにpropertyUtilsbeanNullPointerException.

これが私が実行した方法です:

public static void main(String[] args) throws Exception {
        Ax ax = new Ax();
        ax.setAxAttr("axString");

        Bx bx = new Bx();
        bx.setBxAttr("bxString");

        Cx cx = new Cx();
        cx.setCxAttr("cxString");

        List<Bx> bxs = new ArrayList<Bx>();
        ax.setBxs(bxs);
        ax.getBxs().add(bx);

        List<Cx> cxs = new ArrayList<Cx>();
        bx.setCxs(cxs);
        bx.getCxs().add(cx);


        List<String> xs = new ArrayList<String>();
        cx.setAxs(xs);

        cx.getAxs().add(new String("One"));
        cx.getAxs().add(new String("Two"));
        cx.getAxs().add(new String("Three"));


        MyPropertyUtils myPropertyUtils = new MyPropertyUtils();

        Map map = new HashMap();
        for (String name :  myPropertyUtils.listNestedPropertyName(ax)) {
            map.put(name, PropertyUtils.getNestedProperty(ax, name));
        }

        Ax axNew = new Ax();

        Set<Entry> set = map.entrySet();


        for (Entry entry :set) {
            BeanUtils.setProperty(axNew, entry.getKey().toString(), entry.getValue().toString());
        }



    }

例外

Exception in thread "main" java.lang.NullPointerException
    at org.apache.commons.beanutils.PropertyUtilsBean.getIndexedProperty(PropertyUtilsBean.java:507)
    at org.apache.commons.beanutils.PropertyUtilsBean.getIndexedProperty(PropertyUtilsBean.java:410)
    at org.apache.commons.beanutils.PropertyUtilsBean.getNestedProperty(PropertyUtilsBean.java:768)
    at org.apache.commons.beanutils.PropertyUtilsBean.getProperty(PropertyUtilsBean.java:846)
    at org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:903)
    at org.apache.commons.beanutils.BeanUtils.setProperty(BeanUtils.java:456)
    at com.wavecrest.aspect.Test1.main(Test1.java:57)

すべての提案が受け入れられます:

4

2 に答える 2

1

BeanUtilsインスタンス内にオブジェクトインスタンスを作成しないでくださいaxNew。だから、

BeanUtils.setProperty(axNew, "bxs[0].cxs[0].cxAttr", "Some value"); 

「'bxs'コレクションの最初の要素を取得し、次にその最初の要素を取得してから、このオブジェクトの'cxAttr'プロパティを更新する」という意味です。ただし、現時点ではbxsのプロパティはnullであるため、が発生します。axNewNullPointerException

空のオブジェクトでオブジェクトを初期化する必要があります。そうしないと、メソッドを使用してオブジェクトのプロパティを更新できなくなりますsetProperty。例:

axNew.setBxs(new ArrayList<Bx>());
axNew.getBsx().add(new Bx());
// should works fine
BeanUtils.setProperty(axNew, "bxs[0].bxAttr", "Some value"); 

また、複雑な階層を持つオブジェクトをDB内に格納するのは最善の方法ではないことも付け加えておきます。シリアル化には他にも便利な方法があります。

  • ORM
  • XML/JSONへの変換
  • Javaシリアル化
于 2012-11-23T11:55:23.273 に答える
0

マップのキーがBeanのプロパティ名になるように、JavaBeanをハッシュマップに変換できます。ネストされたBeanの場合、「proprty1.property2」のようなプロパティパスキーを持つことができます。これが法案に適合する場合、私は私のjuffrou-reflectライブラリであなたのための解決策を手に入れました。それが役に立てば幸い。

于 2013-06-17T23:06:04.270 に答える