2014-02-12 1 views
6

У меня есть компонент Java, который имеет поле, которое в свою очередь, является еще одним компонентов-BeanUtils превращающего 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Два типа BeanTwo .. Но сеттеры и геттер типа String .. – 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

Вы должны использовать класс BeanWrapper Spring. Он поддерживает вложенные свойства, и, возможно, создать внутренние бобы для вас:

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

убийца особенность автоматического созданием внутренних бобов достигаются благодаря wrapper.setAutoGrowNestedPaths(true). Значение по умолчанию - false, что означает, что вы получите NullValueInNestedPathException, если элемент в пути свойства равен NULL.

+0

Я использую весенний mvc в своем проекте, и это решение для меня самое лучшее. Подумайте о пружине mvc auto bind JSON для вашего компонента, весна работает очень хорошо. Таким образом, это 'конвертировать карту в bean' решение действительно очень хорошо. – kv9