2014-09-23 185 views
-3

如何映射java.util.Map到POJO?ModelMapper:如何映射java.util.Map到POJO?

以下測試給我一個配置錯誤。

似乎有一個類似的問題被打開,但沒有解決https://github.com/jhalterman/modelmapper/issues/116

測試:

package org.me.modelmapper; 

import java.util.HashMap; 
import org.modelmapper.ModelMapper; 
import org.modelmapper.PropertyMap; 
import org.testng.Assert; 
import org.testng.annotations.BeforeMethod; 
import org.testng.annotations.Test; 

public class MapperTest { 


    private ModelMapper modelMapper; 


    public MapperTest() { 
    } 


    public static class Foo { 

     public String a; 
     public String b; 

     public String getA() { 
      return a; 
     } 

     public void setA(String a) { 
      this.a = a; 
     } 

     public String getB() { 
      return b; 
     } 

     public void setB(String b) { 
      this.b = b; 
     } 

    } 


    @BeforeMethod 
    public void setUpMethod() throws Exception { 
     modelMapper = new ModelMapper(); 
     modelMapper.getConfiguration() 
       .setFieldMatchingEnabled(true); 
    } 

    @Test 
    public void shouldMapHashMapToFoo() { 
     HashMap<String, String> map = new HashMap<>(); 
     map.put("a", "aaaa"); 
     map.put("b", "bbbb"); 

     PropertyMap<HashMap<String, String>, Foo> fooMap = new PropertyMap<HashMap<String, String>, MapperTest.Foo>() { 

      @Override 
      protected void configure() { 
       map(source.get("a"), destination.a); 
       map(source.get("b"), destination.b); 
      } 

     }; 

     modelMapper.addMappings(fooMap); 

     Foo foo = modelMapper.map(map, Foo.class); 

     Assert.assertEquals(foo.getA(), map.get("a")); 
     Assert.assertEquals(foo.getB(), map.get("b")); 

    } 

} 

錯誤:

Configuring TestNG with: [email protected]c399 
Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 2.326 sec <<< FAILURE! 
shouldMapHashMapToFoo(org.me.modelmapper.MapperTest) Time elapsed: 0.186 sec <<< FAILURE! 
org.modelmapper.ConfigurationException: ModelMapper configuration errors: 

1) Invalid source method java.util.HashMap.get(). Ensure that method has zero parameters and does not return void. 

2) Invalid source method java.util.HashMap.get(). Ensure that method has zero parameters and does not return void. 

2 errors 
    at org.modelmapper.internal.Errors.throwConfigurationExceptionIfErrorsExist(Errors.java:241) 
    at org.modelmapper.internal.ExplicitMappingBuilder.visitPropertyMap(ExplicitMappingBuilder.java:228) 
    at org.modelmapper.PropertyMap.configure(PropertyMap.java:380) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.modelmapper.internal.ExplicitMappingBuilder.build(ExplicitMappingBuilder.java:194) 
    at org.modelmapper.internal.TypeMapImpl.addMappings(TypeMapImpl.java:72) 
    at org.modelmapper.internal.TypeMapStore.getOrCreate(TypeMapStore.java:101) 
    at org.modelmapper.ModelMapper.addMappings(ModelMapper.java:93) 
    at org.me.modelmapper.MapperTest.shouldMapHashMapToFoo(MapperTest.java:354) 


Results : 

Failed tests: shouldMapHashMapToFoo(org.me.modelmapper.MapperTest): ModelMapper configuration errors: 
(..) 

Tests run: 1, Failures: 1, Errors: 0, Skipped: 0 
+1

請在此處粘貼錯誤/最小示例的相應部分。 – Smutje 2014-09-23 12:31:58

+0

gist鏈接中的測試已經很小。謝謝。 – dmz73 2014-09-23 12:37:07

+0

請求是在這裏複製/粘貼2個文件的內容。 – StephaneM 2014-09-23 12:38:56

回答

7

它會自動映射。你不需要需要配置任何映射。這將工作:

@Test 
public void shouldMapHashMapToFoo() { 
    HashMap<String, String> map = new HashMap<>(); 
    map.put("a", "aaaa"); 
    map.put("b", "bbbb"); 

    Foo foo = modelMapper.map(map, Foo.class); 

    Assert.assertEquals(foo.getA(), map.get("a")); 
    Assert.assertEquals(foo.getB(), map.get("b")); 

} 

編輯: 如果您需要映射的HashMap更復雜的結構,你可以隨時使用「中間」級。

public static class Bar 
    { 
    private String Z; 
    private String W; 

    public String getZ() 
    { 
     return Z; 
    } 

    public void setZ(String z) 
    { 
     Z = z; 
    } 

    public String getW() 
    { 
     return W; 
    } 

    public void setW(String w) 
    { 
     W = w; 
    } 
    } 

    @Test 
    public void shouldMapHashMapToFoo() 
    { 
    HashMap<String, String> map = new HashMap<>(); 
    map.put("z", "aaaa"); 
    map.put("w", "bbbb"); 

    Bar bar = modelMapper.map(map, Bar.class); 

    PropertyMap<Bar, Foo> barToFooMap = new PropertyMap<Bar, Foo>() 
    { 
     @Override 
     protected void configure() 
     { 
     map().setA(source.getZ()); 
     map().setB(source.getW()); 
     } 

    }; 
    modelMapper.addMappings(barToFooMap); 

    Foo foo = modelMapper.map(bar, Foo.class); 

    Assert.assertEquals(foo.getA(), map.get("z")); 
    Assert.assertEquals(foo.getB(), map.get("w")); 
    } 
+0

如果目標字段名稱與Map鍵不匹配,該怎麼辦?你如何在PropertyMap中指定映射?語法映射(source.get(「source-key」),目標。{destination-field});不起作用。 – dmz73 2014-09-26 09:59:02

+0

創建「中級」POJO類,其中所有字段都與地圖中的鍵匹配。映射到該類。然後將中間POJO映射到您的POJO。 – bigGuy 2014-09-26 10:18:45

+0

必須有一個更有效的方法來實現這個...我正在查看文檔中的字符串映射主題,但它記錄很少:http://modelmapper.org/user-manual/property-mapping/#string-映射 – dmz73 2014-09-26 11:01:05