I'm new to ModelMapper, but I like the concept so far. I have a requirement to map object to another object, with transformation & lookup.
Since I'm getting some strange exceptions, I suppose I am misusing the API. To reproduce it, I created a simple test case, where I map Person object to PersonDTO.
The idea is to map firstName, lastName, and then firstName + " " + lastName to displayName of the PersonDTO object. I've created a custom mapping:
@Test
public void mapWithCustomTypeMap()
{
ModelMapper mapper = new ModelMapper();
CustomMap customMap = new CustomMap();
mapper.addMappings(customMap);
Person p = new Person();
p.setFirstName("Test first");
p.setLastName("Test last");
PersonDTO mapped = mapper.map(p, PersonDTO.class);
assertEquals(p.getFirstName(), mapped.getFirstName());
assertEquals(p.getLastName(), mapped.getLastName());
assertNull(mapped.getDisplayName());
assertEquals(p.getFirstName() + " " + p.getLastName(), mapped.getDisplayName());
}
I get several exceptions (see below - I aplogize for lengthy stackstrace). I suppose there's something I'm doing wrong? In the end, I would like to lookup the destination value in a "repository" using a key from a source object. So, the typemapper would looke something like this: map().setX(_repo.lookup(source.getId()).getX()); ... which brings up another topic of deferred execution, but let's fix the current problem first. :)
Miha.
mapWithCustomResolver(mapper.MapperTest) Time elapsed: 0.1 sec <<< ERROR!
org.modelmapper.MappingException: ModelMapper mapping errors:
1) Error mapping mapper.Person to mapper.PersonDTO
1 error
at org.modelmapper.internal.Errors.throwMappingExceptionIfErrorsExist(Errors.java:337)
at org.modelmapper.internal.MappingEngineImpl.map(MappingEngineImpl.java:79)
at org.modelmapper.ModelMapper.map(ModelMapper.java:230)
at org.modelmapper.ModelMapper.map(ModelMapper.java:185)
at mapper.MapperTest.mapWithCustomResolver(MapperTest.java:36)
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:601)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:35)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:115)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:97)
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:601)
at org.apache.maven.surefire.booter.ProviderFactory$ClassLoaderProxy.invoke(ProviderFactory.java:103)
at com.sun.proxy.$Proxy0.invoke(Unknown Source)
at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:150)
at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:91)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69)
Caused by: org.modelmapper.MappingException: ModelMapper mapping errors:
1) Failed to get value from mapper.Person.getLastName()
1 error
at org.modelmapper.internal.Errors.toMappingException(Errors.java:243)
at org.modelmapper.internal.PropertyInfoImpl$MethodAccessor.getValue(PropertyInfoImpl.java:107)
at org.modelmapper.internal.MappingEngineImpl.resolveSourceValue(MappingEngineImpl.java:195)
at org.modelmapper.internal.MappingEngineImpl.propertyMap(MappingEngineImpl.java:162)
at org.modelmapper.internal.MappingEngineImpl.typeMap(MappingEngineImpl.java:140)
at org.modelmapper.internal.MappingEngineImpl.map(MappingEngineImpl.java:101)
at org.modelmapper.internal.MappingEngineImpl.map(MappingEngineImpl.java:70)
... 32 more
Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class
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:601)
at org.modelmapper.internal.PropertyInfoImpl$MethodAccessor.getValue(PropertyInfoImpl.java:102)
... 37 more