Обычно сопоставители объектов предназначены для сценариев, чтобы сопоставить больший набор данных с небольшим набором (пример: Entity
объект имеет много данных, но мы хотим вернуть только некоторые из них).
Сопоставители объектов обычно создают новый экземпляр целевого объекта небольшого набора и устанавливают необходимые поля из исходного объекта с большим набором, но у меня противоположный сценарий: у меня есть целевой объект, который уже содержит некоторые данные, и теперь мне нужно сопоставить новый источник объект с меньшим набором данных в целевой объект.
Исходный класс
public class SrcObj {
private String name;
private int i;
Класс назначения
public class DestObj {
private String name;
private int i;
private float f;
private boolean b;
DesObj уже содержит значение int i и float f, SrcObj имеет имя String и int, мне нужно сохранить данные SrcObj в DestObj без потери существующих данных.
Model Mapper всегда создает новый объект DestObj, который будет отображать в него SrcObj, но остальные поля пусты.
public class ObjectMapper {
public static void main(String[] args) {
SrcObj src = new SrcObj("src name", 1);
DestObj dest = new DestObj(null, 0, 1, true);
ModelMapper modelMapper = ObjectMapper.modelMapper();
dest = modelMapper.map(src, DestObj.class);
System.out.println(dest);
}
private static ModelMapper modelMapper() {
ModelMapper modelMapper = new ModelMapper();
PropertyMap<SrcObj, DestObj> orderMap = new PropertyMap<SrcObj, DestObj>() {
protected void configure() {
// map().setI(destination.getI());
map().setI(source.getI());
System.out.println("model mapper");
map().setName(source.getName());
}
};
modelMapper.addMappings(orderMap);
return modelMapper;
}
}
в программе отображения моделей есть возможность использовать пункт назначения, прокомментированный выше, но он не работает.
как я могу иметь destObj, содержащий все значения destObj[name="src name", i=1,f=1.1,b=true]
modelMapper.map(src, dest);
, но это дает ошибку времени компиляции Несоответствие типов: невозможно преобразовать из void в DestObj, потому что этот возвращаемый тип перегруженного метода имеет значение void. - person shrikant.sharma   schedule 30.06.2018dest
. Да и незачем, так как этот метод не создает новый DestObj: он модифицируетdest
. Так же, как вы не можете использоватьdest = dest.setName("foo");
. Вы просто используетеdest.setName("foo");
. - person JB Nizet   schedule 30.06.2018