BeanUtils将java.util.Map转换为嵌套bean

BeanUtils将java.util.Map转换为嵌套bean,java,javabeans,pojo,apache-commons-beanutils,Java,Javabeans,Pojo,Apache Commons Beanutils,我有一个javabean,它有一个字段,这个字段又是另一个bean public class BeanOne { private String fieldOne; private BeanTwo fieldTwo; public String getFieldOne() {return this.fieldOne;} public void setFieldOne(String fieldOne){this.fieldOne = fieldOne} publ

我有一个javabean,它有一个字段,这个字段又是另一个bean

public class BeanOne {
   private String fieldOne;
   private BeanTwo fieldTwo;

   public String getFieldOne() {return this.fieldOne;}  
   public void setFieldOne(String fieldOne){this.fieldOne = fieldOne}

   public BeanTwo getFieldTwo() {return this.fieldTwo;}  
   public void setFieldTwo(BeanTwo fieldTwo){this.fieldTwo = fieldTwo}
}

public class BeanTwo {
   private String fieldOne;

   public String getFieldOne() {return this.fieldOne;}  
   public void setFieldOne(String fieldOne){this.fieldOne = fieldOne}
}
我正在尝试将地图传递给BeanUtils,以尝试将以下地图转换为Beanune

Map beanOneMap = new HashMap<String, Object>();
beanOneMap.put("fieldOne", "fieldOneValue");
Map beanTwoMap = new HashMap<String, Object>();
beanTwoMap.put("fieldOne", "fieldOneValue");
beanOneMap.put("fieldTwo", beanTwoMap);

BeanOne beanOne = new BeanOne();
BeanUtils.populate(beanOne, beanOneMap);
Map beaneomap=newhashmap();
beanOneMap.put(“fieldOne”、“fieldOneValue”);
Map beanTwoMap=newhashmap();
beanTwoMap.put(“fieldOne”、“fieldOneValue”);
beanOneMap.put(“fieldTwo”,beanTwoMap);
BeanOne BeanOne=新的BeanOne();
填充(beanOne,beanOneMap);
但它抛出了一个错误,即-
无法调用bean类“class bean”上的BeanOne.setFieldTwo-参数类型不匹配-具有类型为“java.util.HashMap”的对象,但预期签名为“BeanTwo”


如何使用BeanUtils正确填充内部bean?

我们开始吧,您可以这样做

BeanOne.java

import java.util.Map;

public class BeanOne {
    private String fieldOne;
    private Map<String,BeanTwo> fieldTwo;
    public Map<String, BeanTwo> getFieldTwo() {
        return fieldTwo;
    }

    public void setFieldTwo(Map<String, BeanTwo> fieldTwo) {
        this.fieldTwo = fieldTwo;
    }

    public String getFieldOne() {
        return this.fieldOne;
    }

    public void setFieldOne(String fieldOne) {
        this.fieldOne = fieldOne;
    }
}
Tester.java

import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;

public class Tester {
    public static void main(String[] args) throws IllegalAccessException,
            InvocationTargetException {
        Map beanTwoMap = new HashMap();
        beanTwoMap.put("fieldOne", "fieldOne2222Value");
        Map beanOneMap = new HashMap();
        beanOneMap.put("fieldOne", "fieldOneValue");
        beanOneMap.put("fieldTwo", beanTwoMap);
        BeanOne beanOne = new BeanOne();
        BeanUtils.populate(beanOne, beanOneMap);
        System.out.println(beanOne.getFieldOne());
        System.out.println(beanOne.getFieldTwo().get("fieldOne"));
    }

}
输出将是:-

fieldOneValue
fieldOne2222Value

您应该使用Spring的BeanRapper类。它支持嵌套属性,并可以选择为您创建内部bean:

BeanOne one = new BeanOne();
BeanWrapper wrapper = PropertyAccessorFactory.forBeanPropertyAccess(one);
wrapper.setAutoGrowNestedPaths(true);

Map<String, Object> map = new HashMap<>();
map.put("fieldOne", "fieldOneValue");
map.put("fieldTwo.fieldOne", "fieldOneValue");

wrapper.setPropertyValues(map);

assertEquals("fieldOneValue", one.getFieldOne());
BeanTwo two = one.getFieldTwo();
assertNotNull(two);
assertEquals("fieldOneValue", two.getFieldOne();
BeanOne one=newbeanone();
BeanRapper包装器=PropertyAccessorFactory.forBeanPropertyAccess(一个);
wrapper.setAutologownestedPath(true);
Map Map=newhashmap();
map.put(“fieldOne”、“fieldOneValue”);
map.put(“fieldTwo.fieldOne”、“fieldOneValue”);
setPropertyValues(map);
assertEquals(“fieldOneValue”,one.getFieldOne());
BeanTwo-two=1.getFieldTwo();
assertNotNull(两个);
assertEquals(“fieldOneValue”,two.getFieldOne();

通过
wrapper.setAutologownestedPaths(true)实现了自动创建内部bean的杀手级功能
。默认值为false,这意味着如果属性路径中的元素为null,您将获得一个
NullValueInTestedPathException

检查BeanOne.java的字段两个BeanTwo类型..但setters和getter类型为String..谢谢。我意外编写了它。现在修复了它。我不相信这是可能的。填充
BeanTwo
,然后用它填充
BeanOne
。我在我的项目中使用spring mvc,这个解决方案对我来说是最好的。想想spring mvc自动将JSON绑定到你的bean,spring工作得非常好。所以,这个
将映射转换为bean
的解决方案真的非常好。
BeanOne one = new BeanOne();
BeanWrapper wrapper = PropertyAccessorFactory.forBeanPropertyAccess(one);
wrapper.setAutoGrowNestedPaths(true);

Map<String, Object> map = new HashMap<>();
map.put("fieldOne", "fieldOneValue");
map.put("fieldTwo.fieldOne", "fieldOneValue");

wrapper.setPropertyValues(map);

assertEquals("fieldOneValue", one.getFieldOne());
BeanTwo two = one.getFieldTwo();
assertNotNull(two);
assertEquals("fieldOneValue", two.getFieldOne();