2014-09-30 1 views
0

Я получаю NullPointerException, когда я пытаюсь добавить сопоставления, создав свой настраиваемый mapper в некоторых объектах, управляемых контейнером. Я попробовал это в службе @Stateless EJB и службе обслуживания @RequestScoped. Ошибка аналогична и встречается в строке:Пользовательские сопоставления с использованием библиотеки ModelMapper в управляемых компонентах приводят к NullPointerException

modelMapper.addMappings(skipCdeMap); 

Это ошибка? Я предполагаю, что картограф пытается сделать некоторые вещи отражения на управляемом 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

ответ

1

Я могу ответить на свой вопрос. Мои предположения были правильными. Когда я создал класс PropertyMap в Pojo или сам по себе, выделенные классы-сопоставления работали хорошо. Поэтому я предполагаю, что моя предыдущая ошибка возникает из-за отражения, которое ModelMapper делает для класса, в котором была создана PropertyMap. Если это какой-то Menaged Bean, который приведет к NullPointerException.

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

 Смежные вопросы

  • Нет связанных вопросов^_^