【问题标题】:Object Mapping without losing existing data不丢失现有数据的对象映射
【发布时间】:2018-07-01 15:56:44
【问题描述】:

通常对象映射器用于将较大数据集映射到较小数据集的场景(例如: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;
}
}

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

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

【问题讨论】:

  • 你忘了问问题......
  • modelmapper.org/javadoc/org/modelmapper/…。但是根据我的经验,应该不惜一切代价避免使用此类映射器:它们只会为您节省几行琐碎的代码来将属性从一个对象复制到另一个对象,但在处理更复杂的映射、不可变对象等时会使事情变得更加困难. 最重要的是,当您重命名源类中的属性并且不对目标类应用相同的重构(反之亦然)时,它们会静默失败,从而导致在编写副本时不会发生大量错误自己。
  • @JBNizet 我已经浏览了文档但没有成功。是的,我知道其中的含义,但现在我有简单的对象,所以没关系。
  • 然后发布一个完整的最小示例,说明您在使用我链接到的方法后尝试了什么,并准确说明您期望发生什么,以及发生了什么。
  • HI @JBNizet 我希望这就是你所说的modelMapper.map(src, dest);,但它给出了编译时错误类型不匹配:无法从 void 转换为 DestObj,因为这个重载的方法返回类型是 void。

标签: java oop modelmapper


【解决方案1】:

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

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

您可以简单地 modelMapper.map(src, dest) 从源更新目标的属性。

【讨论】:

    【解决方案2】:

    @Chun Han Hsiao 感谢您的回复,它起作用了,只是为了解决问题。

        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);
    

    【讨论】:

      猜你喜欢
      • 2010-11-05
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      • 2016-09-23
      • 2017-07-11
      • 2013-08-01
      • 2023-03-15
      • 2019-09-19
      相关资源
      最近更新 更多