2014-02-12 11 views
6

Ich habe eine Java-Bean, die ein Feld hat, die wiederum ist eine weitere BohneBeanUtils java.util.Map zu verschachtelt Bohne Umwandlung

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

Ich versuche, eine Karte zu BeanUtils passieren, um zu versuchen und wandeln die folgenden Karte in 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); 

Aber es wirft einen Fehler zu sagen - Cannot invoke BeanOne.setFieldTwo on bean class 'class Bean' - argument type mismatch - had objects of type "java.util.HashMap" but expected signature "BeanTwo"

Wie kann ich BeanUtils verwenden, um richtig die innere Bohne bevölkern?

+0

Überprüfen Sie BeanOne.java fieldTwo Typ BeanTwo .. Aber Setter und Getter Typ String .. – Naren

+0

danke. Ich hatte das versehentlich geschrieben. habe es jetzt behoben. – Skynet

+0

Ich glaube nicht, dass das möglich ist. Füllen Sie 'BeanTwo' aus und füllen Sie dann' BeanOne' damit aus. –

Antwort

4

Hier gehen wir Sie können wie folgt tun ....

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

} 

Ausgabe wird sein: -

fieldOneValue 
fieldOne2222Value 
4

Sie sollten Spring's BeanWrapper-Klasse verwenden. Es unterstützt verschachtelte Eigenschaften, und erstellen Sie optional innere Bohnen für Sie:

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

Das Killer-Feature der automatischen Erstellung von Innen Bohnen dank wrapper.setAutoGrowNestedPaths(true) erreicht wird. Der Standardwert ist false. Dies bedeutet, dass Sie NullValueInNestedPathException erhalten, wenn ein Element im Eigenschaftspfad null ist.

+0

Ich benutze Federmvc in meinem Projekt, und diese Lösung ist das Beste für mich. Denken Sie an Frühling Mvc Auto binden JSON zu Ihrer Bohne, Frühling funktioniert sehr gut. Also, diese 'map to bean'-Lösung ist wirklich sehr gut. – kv9