具有多个转换器和提供程序的ModelMapper

时间:2018-05-11 18:12:44

标签: converter provider modelmapper

我有两个提供程序,而ModelMapper正在使用一个错误的属性!在我的情况下,我有UserProvider和UfProvider,它正在调用UserProvider到UfUi的一个实例,我收到了这个错误:

    Failed to set value 'UserModel [dtNasc=null, idUf=null, login=null, name=null, password=null, urlAvatar=null, cidade=null, posts=[], postScores=[], privatePostScores=[], privatePosts=[], privateTopicUsers=[], testDrives=[], testDriveScores=[], userRoles=[], logins=[], topicUserVieweds=[]]' on br.com.xlib.putariaBR.model.CidadeModel.setUf()

1 error
at org.modelmapper.internal.Errors.toMappingException(Errors.java:258)
at org.modelmapper.internal.PropertyInfoImpl$MethodMutator.setValue(PropertyInfoImpl.java:127)
at org.modelmapper.internal.MappingEngineImpl.setDestinationValue(MappingEngineImpl.java:256)
at org.modelmapper.internal.MappingEngineImpl.propertyMap(MappingEngineImpl.java:186)
at org.modelmapper.internal.MappingEngineImpl.typeMap(MappingEngineImpl.java:135)
at org.modelmapper.internal.MappingEngineImpl.map(MappingEngineImpl.java:92)
at org.modelmapper.internal.MappingEngineImpl.map(MappingEngineImpl.java:60)
... 43 more
Caused by: java.lang.IllegalArgumentException: java.lang.ClassCastException@2220c5f7
at sun.reflect.GeneratedMethodAccessor70.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.modelmapper.internal.PropertyInfoImpl$MethodMutator.setValue(PropertyInfoImpl.java:125)
... 48 more
2018-05-10 20:56:53.150 [ERROR] br.com.xlib.putariaBR.service.impl.AbstractServiceImpl : org.modelmapper.MappingException: ModelMapper mapping errors:

这是我的映射器:

public class UiModelMapper {
    private static final Logger LOGGER = LogManager
            .getLogger(UiModelMapper.class);

        protected ModelMapper createMappings() {
        ModelMapper modelMapper;

        try {
            modelMapper = new ModelMapper();
            modelMapper.getConfiguration()
                    .setMatchingStrategy(MatchingStrategies.STRICT);

            return modelMapper;
        } catch (Exception e) {
            LOGGER.error(e.getMessage(), e);
            throw new RuntimeException(e);
        }
    }

      public void mapCidade(CidadeModel cidadeModel, CidadeUi cidadeUi) {
        LOGGER.info("BEGIN");
        ModelMapper modelMapper = createMappings();
        modelMapper.addMappings(new CidadePropertyMap());

        LOGGER.info("Converting to cidadeUi:");
        modelMapper.validate();
        modelMapper.map(cidadeModel, cidadeUi);
        LOGGER.info("END");
    }
}

public class CidadePropertyMap
        extends AbstractPropertyMap<CidadeEntity, CidadeUi> {

    private static final Logger LOGGER = LogManager
            .getLogger(CidadePropertyMap.class);

    @Override
    protected void configure() {
        LOGGER.info("BEGIN");
        UserProvider userProvider = new UserProvider();

        with(userProvider).map().setUserAltered(source.getUserAltered());
        with(userProvider).map().setUserCreated(source.getUserCreated());

        UfProvider ufProvider = new UfProvider();
        UserListConverter userListConverter = new UserListConverter();

        with(ufProvider).map().setUf(source.getUf());

        using(userListConverter).map().setUsers(source.getUsers());
        LOGGER.info("END");
    }

}

public class UserProvider extends AbstractProvider<UserUi> {

    @Override
    protected UserUi get() {
        return new UserUi();
    }

}

public class UfProvider extends AbstractProvider<UfUi> {

    @Override
    protected UfUi get() {
        return new UfUi();
    }

}

public class UserListConverter
        extends AbstractConverter<List<UserModel>, List<UserModel>> {
    private static final Logger LOGGER = LogManager
            .getLogger(UserListConverter.class);

    @Override
    protected List<UserModel> convert(List<UserModel> userModels) {
        LOGGER.info("BEGIN");
        List<UserModel> userUis = new ArrayList<UserModel>();
        UiModelMapper uiModelMapper = new UiModelMapper();
        UserUi userUi;

        for (UserModel userModel : userModels) {
            userUi = new UserUi();
            uiModelMapper.mapUser(userModel, userUi);

            userUis.add(userUi);
        }

        LOGGER.info("END");
        return userUis;
    }

}

检查ModelMapper的源代码,似乎我只能使用一个转换器,每个Mapper的提供程序,这解释了为什么它使用错误的Provider来创建不同类型的实例。即使我按属性使用提供者和转换器它也不起作用,因为我添加到我的属性的更多转换器我只是在映射器本身内替换相同的转换器!

进一步研究ModelMapper,我意识到Uf属性的MappingContext是错误的提供者(UserProvider),如果每个属性都有自己的上下文,那么就不会发生。

0 个答案:

没有答案