Пользовательские сопоставления с использованием библиотеки ModelMapper в управляемых компонентах приводят к исключению NullPointerException.

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

modelMapper.addMappings(skipCdeMap);

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

person Ziemo    schedule 30.09.2014    source источник
comment
Вы используете 0.7.2? Если да, то есть ли у вас небольшой тест, воспроизводящий проблему, которую вы можете опубликовать?   -  person Jonathan    schedule 02.10.2014


Ответы (2)


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

person Ziemo    schedule 07.10.2014
comment
Что вы сделали, чтобы это исправить? Я думаю, что у меня та же проблема stackoverflow.com/questions/53287450/ - person Marc; 05.12.2018
comment
Ziemo на самом деле говорит, что он сделал, чтобы исправить это, но мне также пришлось разгадать ответ. Вы должны создать явный класс и расширить его от PropertyMap. У ExplicitMappingBuilder есть некоторые проблемы с этим. - person DKM; 16.10.2019

У меня та же проблема (используя 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);
}
person davioooh    schedule 12.04.2016
comment
Я думаю, что это единственное правильное решение, которое работает для меня :) Спасибо! - person Matley; 27.04.2021