2014-09-30 81 views
0

当我尝试通过在某些容器管理对象中创建自定义映射器来添加映射时,我得到NullPointerException。我在@Stateless EJB服务和@RequestScoped rest服务中尝试了它。错误是类似的,并发生在一行:在托管bean中使用ModelMapper库的自定义映射导致NullPointerException

modelMapper.addMappings(skipCdeMap); 

它是一个错误?我假设mapper试图在托管bean上做一些反射的东西,并因此得到NullPointerException

这是我的代码:

PropertyMap<ObjectAbcDto, ObjectAbc> skipCdeMap = 
    new PropertyMap<ObjectAbcDto, ObjectAbc>() { 
     protected void configure() { 
      skip().setObjectCde(null); 
     } 
    }; 

modelMapper.addMappings(skipCdeMap); 

这是错误:

13:37:03,453 ERROR [stderr] (default task-12) org.modelmapper.ConfigurationException: ModelMapper configuration errors: 
13:37:03,453 ERROR [stderr] (default task-12) 
13:37:03,453 ERROR [stderr] (default task-12) 1) Error reading class com.app.SomeRestEasyService$1 
13:37:03,453 ERROR [stderr] (default task-12) 
13:37:03,453 ERROR [stderr] (default task-12) 2) Failed to configure mappings 
13:37:03,454 ERROR [stderr] (default task-12) 
13:37:03,454 ERROR [stderr] (default task-12) 2 errors 
13:37:03,454 ERROR [stderr] (default task-12) at org.modelmapper.internal.Errors.throwConfigurationExceptionIfErrorsExist(Errors.java:241) 
13:37:03,454 ERROR [stderr] (default task-12) at org.modelmapper.internal.ExplicitMappingBuilder.build(ExplicitMappingBuilder.java:206) 
13:37:03,454 ERROR [stderr] (default task-12) at org.modelmapper.internal.TypeMapImpl.addMappings(TypeMapImpl.java:72) 
13:37:03,454 ERROR [stderr] (default task-12) at org.modelmapper.internal.TypeMapStore.getOrCreate(TypeMapStore.java:101) 
13:37:03,454 ERROR [stderr] (default task-12) at org.modelmapper.ModelMapper.addMappings(ModelMapper.java:93) 
13:37:03,454 ERROR [stderr] (default task-12) at com.app.SomeRestEasyService.create(SomeRestEasyService.java:129) 
13:37:03,454 ERROR [stderr] (default task-12) at com.app.SomeRestEasyService$Proxy$_$$_WeldClientProxy.create(Unknown Source)   
[...] 
13:37:03,459 ERROR [stderr] (default task-12) Caused by: java.lang.NullPointerException 
13:37:03,459 ERROR [stderr] (default task-12) at org.modelmapper.internal.ExplicitMappingBuilder.validateVisitedMappings(ExplicitMappingBuilder.java:236) 
13:37:03,459 ERROR [stderr] (default task-12) at org.modelmapper.internal.ExplicitMappingBuilder.visitPropertyMap(ExplicitMappingBuilder.java:227) 
13:37:03,459 ERROR [stderr] (default task-12) at org.modelmapper.PropertyMap.configure(PropertyMap.java:380) 
13:37:03,459 ERROR [stderr] (default task-12) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
13:37:03,459 ERROR [stderr] (default task-12) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
13:37:03,459 ERROR [stderr] (default task-12) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
13:37:03,460 ERROR [stderr] (default task-12) at java.lang.reflect.Method.invoke(Method.java:606) 
13:37:03,460 ERROR [stderr] (default task-12) at org.modelmapper.internal.ExplicitMappingBuilder.build(ExplicitMappingBuilder.java:194) 
13:37 
+0

您使用的0.7.2?如果是这样,你碰巧有一个小的测试,重现您可以发布的问题? – Jonathan 2014-10-01 20:17:45

回答

1

我可以在我自己的问题回答。我的假设是正确的。当我在Pojo中创建PropertyMap类或在其自己的专用类映射中运行良好时。所以我想我之前的错误是因为ModelMapper在创建PropertyMap的类上进行的反射而发生的。如果它是一些会导致NullPointerException的Menaged Bean。

1

我有同样的问题(使用ModelMapper v0.7.5)试图将String映射到UUID

例如,有这些类:

public class Car { 

    private UUID id; 

    // other fields 

} 

public class CarDto { 

    private String id; 

    // other fields 

} 

,并试图建立一个自定义的映射是这样的:

mapper.addMappings(new PropertyMap<CarDto, Car>() { 
     protected void configure() { 
      map().setId(UUID.fromString(source.getId())); 
      // other mappings 
     } 
    }); 

我得到同样的配置错误。

原因是UUID是最终的类,不能由ModelMapper框架代理。

正如我在Car类创建这样一个方法解决方法:

public void setIdAsString(String id) { 
    this.id = UUID.fromString(id); 
}