2014-02-12 41 views
6

我有一個Java bean其中有一個領域這又是另外一個beanBeanUtils的轉換java.util.Map嵌套豆

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<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); 

但它拋出一個錯誤說 - Cannot invoke BeanOne.setFieldTwo on bean class 'class Bean' - argument type mismatch - had objects of type "java.util.HashMap" but expected signature "BeanTwo"

如何使用BeanUtils的正確填充內豆?

+0

檢查BeanOne.java的fieldTwo類型BeanTwo ..但是setter和類型String的getter .. – Naren

+0

謝謝。我不小心寫了那個。現在修復它。 – Skynet

+0

我不相信這是可能的。填充'BeanTwo',然後填充'BeanOne'。 –

回答

4

在這裏,我們去,你可以像這樣....

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; 
    } 
} 

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 
4

你應該使用Spring的BeanWrapper類。它支持嵌套屬性,以及可選爲您創建內部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(); 

自動創建內部bean的殺手級功能,實現歸功於wrapper.setAutoGrowNestedPaths(true)。默認值爲false,這意味着如果屬性路徑中的元素爲空,您將得到NullValueInNestedPathException

+0

我在我的項目中使用spring mvc,這個解決方案對我來說是最好的。想想春天MVC自動綁定JSON到你的bean,春天工作得很好。所以,這個「將地圖轉換爲bean」解決方案確實非常好。 – kv9