当前位置: 首页 > 知识库问答 >
问题:

在不丢失现有数据的情况下进行对象映射

龚鸿羽
2023-03-14

通常对象映射器用于将较大的数据集映射到较小的数据集的场景(例如: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 name和int,我需要在不丢失现有数据的情况下将SrcObj数据保存到DestObj中。

模型映射器总是创建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;
}
}

模型映射器中有一个使用目标的选项,上面评论过,但它不起作用。

我怎么能让deObj包含所有值deObj[name="src name", i=1, f=1.1, b=true]

共有2个答案

伍心水
2023-03-14

@谢谢你的回复,它奏效了,只是为了解决问题。

    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);
上官树
2023-03-14

首先,如果您不想在类中使用getter/setter,您可以只启用字段匹配功能。

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

您可以简单地ModelMapper.map(src, est),它将从源代码更新est的属性。

 类似资料: