1

我正在尝试将 java bean 转换为 hashmap,然后将 hashmap 转换为 java bean。为了将 Java Object 转换为 hashmap,这篇文章帮助了我。 使用 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] --> 一个
bxs[ 0].cxs[0].items[1] --> 两个
bxs[0].cxs[0].items[2] --> 三个

我将这些键值存储在DB其中,稍后检索它们,并希望再次转换为 Java Bean。但是为了在我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' 属性”。但此时 of 的bxs属性axNew为空,这导致NullPointerException.

您需要使用空对象初始化对象,然后才能使用setProperty方法更新它们的属性,例如:

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

我还要补充一点,这不是在 DB 中存储具有复杂层次结构的对象的最佳方式。还有其他更有用的序列化方法:

  • 甲骨文
  • 转换为 XML/JSON
  • Java 序列化
  • 等等
于 2012-11-23T11:55:23.273 回答
0

您可以将 java bean 转换为哈希映射,以便映射的键是 bean 的属性名称。对于嵌套 bean,您可以拥有属性路径键,例如“proprty1.property2”。如果这符合要求,我可以使用我的 juffrou-reflect 库为您提供解决方案。希望能帮助到你。

于 2013-06-17T23:06:04.270 回答