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

我有一个Java bean,它有一个字段,而这个字段又是另一个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以尝试将以下映射转换为BeanOne

 Map beanOneMap = new HashMap(); beanOneMap.put("fieldOne", "fieldOneValue"); Map beanTwoMap = new HashMap(); beanTwoMap.put("fieldOne", "fieldOneValue"); beanOneMap.put("fieldTwo", beanTwoMap); BeanOne beanOne = new BeanOne(); BeanUtils.populate(beanOne, beanOneMap); 

但它抛出一个错误说 – Cannot invoke BeanOne.setFieldTwo on bean class 'class Bean' - argument type mismatch - had objects of type "java.util.HashMap" but expected signature "BeanTwo"

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

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

 BeanOne one = new BeanOne(); BeanWrapper wrapper = PropertyAccessorFactory.forBeanPropertyAccess(one); wrapper.setAutoGrowNestedPaths(true); Map 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(); 

由于wrapper.setAutoGrowNestedPaths(true)实现了自动创建内部bean的杀手级function。 默认值为false,这意味着如果属性路径中的元素为null,则将获得NullValueInNestedPathException

我们在这里你可以这样做….

BeanOne.java

 import java.util.Map; public class BeanOne { private String fieldOne; private Map fieldTwo; public Map getFieldTwo() { return fieldTwo; } public void setFieldTwo(Map fieldTwo) { this.fieldTwo = fieldTwo; } public String getFieldOne() { return this.fieldOne; } public void setFieldOne(String fieldOne) { this.fieldOne = fieldOne; } } 

BeanTwo.java

 public class BeanTwo { private String fieldOne; 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