Есть ли способ изменить отображение по умолчанию? - PullRequest
2 голосов
/ 15 апреля 2019

Я хочу отобразить тип 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 для сопоставления, чтобы преобразовать String в Map<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);

Спасибо за все подсказки и ответы.

...