首页 > 解决方案 > 有没有办法更改默认映射?

问题描述

我想将一个SourceClass类型映射到一个DestinationClass类型。

public class SourceClass {

    private Integer id;

    private String number;

    private String username;

    private String email;

}
public class DestinationClass {

    private Integer id;

    private Map<String, Object> number;

    private Map<String, Object> username;

    private Map<String, Object> email;

}

目前我使用自定义Converter进行映射,转换StringMap<String, Object>.

// this function will new and set a map object
public Map<String, Object> setData(String title, Object value {
    Map<String, Object> result = Maps.newHashMap();
    result.put("title", title);
    result.put("value", value);

    return result;
}

// this function will return my custom converter
public Converter<String, Map<String, Object>> myConverter(String title) {
    // LocalI18nUtils.getString(String key) input key and get the translation
    return ctx -> setData(LocalI18nUtils.getString(title), ctx.getSource());
}

并使用modelMapper.addMappings()

PropertyMap<SourceClass, DestinationClass> mappings = new PropertyMap<SourceClass, DestinationClass>() {
    @Override
    protected void configure() { 
using(myConverter("Number"))).map(source.getNumber()).setNumber(null);
using(myConverter("Username"))).map(source.getUsername()).setUsername(null);
using(myConverter("Email"))).map(source.getEmail()).setEmail(null);
    }
}

// source is SourceClass type object
ModelMapper modelMapper = new ModelMapper();
modelMapper.addMappings(mappings);
modelMapper.map(source, DestinationClass.class);

因此,源对象和目标对象应该是:

// source
{
    "id": 1,
    "number": "mem_0001",
    "username": "member0001",
    "email": "member001@mail.com"
}
// destination
{
    "id": 1,
    "number": {
        "title": "Number",
        "value": "mem_0001"
    },
    "username": {
        "title": "Username",
        "value": "member0001"
    },
    "email": {
        "title": "Email",
        "value": "member001@mail.com"
    }
}

我之前读过这个问题=>如何自定义 ModelMapper

解决方案说明ModelMapper自定义映射已添加到默认映射中,因此您不需要例如指定id

//  you don't need to write this statement.
map(source.getId()).setId(null);

所以我在想,有没有办法改变(或覆盖)默认映射,这样我就可以写更少的代码。

也许它看起来像:

ModelMapper modelMapper = new ModelMapper();
// ...
// something will change default mappings to myConverter 
// ...
modelMapper.map(source, DestinationClass.class);

感谢您的所有帮助和解答。

标签: javamodelmapper

解决方案


推荐阅读