Сопоставление объектов без потери существующих данных - PullRequest
0 голосов
/ 30 июня 2018

Обычно Object Mappers предназначены для сценариев, чтобы отобразить больший набор данных в небольшой набор (пример: 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;
}
}

есть возможность в Model mapper использовать пункт назначения, прокомментированный выше, но он не работает.

как я могу получить destObj, содержащий все значения destObj [name = "src name", i = 1, f = 1.1, b = true]

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

@ Чунь Хань Сяо, спасибо за ваш ответ, это сработало, только ради решения.

    SrcObj src = new SrcObj("src name", 1);
        DestObj dest = new DestObj(null, 0, 1, true);
    ModelMapper modelMapper = ObjectMapper.modelMapper();
 modelMapper.map(src, dest);
        System.out.println(dest);
0 голосов
/ 01 июля 2018

Во-первых, если вы не хотите использовать метод получения / установки в ваших классах, вы можете просто включить функцию сопоставления полей.

modelMapper.getConfiguration()
    .setFieldMatchingEnabled(true)
    .setFieldAccessLevel(AccessLevel.PRIVATE);

И вы можете просто modelMapper.map(src, dest), который обновит свойства dest из источника.

...