Я хочу отобразить тип 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);
Спасибо за все подсказки и ответы.