当前位置: 首页 > 面试题库 >

Modelmapper:当源对象为null时,如何应用自定义映射?

卫逸春
2023-03-14
问题内容

假设我有课MySource

public class MySource {
    public String fieldA;
    public String fieldB;

    public MySource(String A, String B) {
       this.fieldA = A;
       this.fieldB = B;
    }
}

我想将其翻译为object MyTarget

public class MyTarget {
    public String fieldA;
    public String fieldB;
}

使用默认的ModelMapper设置,我可以通过以下方式实现:

ModelMapper modelMapper = new ModelMapper();
MySource src = new MySource("A field", "B field");
MyTarget trg = modelMapper.map(src, MyTarget.class); //success! fields are copied

但是,可能会发生该MySource对象null。在这种情况下,MyTarget还将是null

    ModelMapper modelMapper = new ModelMapper();
    MySource src = null;
    MyTarget trg = modelMapper.map(src, MyTarget.class); //trg = null

我想以这种方式指定自定义映射,(伪代码):

MySource src != null ? [perform default mapping] : [return new MyTarget()]

有人知道如何编写适当的转换器来实现这一目标吗?


问题答案:

无法直接使用ModelMapper,因为ModelMapper
map(Source, Destination)方法会检查source是否为null,在这种情况下,它将引发异常。

看一下ModelMapper Map方法的实现:

public <D> D map(Object source, Class<D> destinationType) {
    Assert.notNull(source, "source"); -> //IllegalArgument Exception
    Assert.notNull(destinationType, "destinationType");
    return mapInternal(source, null, destinationType, null);
  }

我建议扩展ModelMapper类并map(Object source, Class<D> destinationType)像这样重写:

public class MyCustomizedMapper extends ModelMapper{

    @Override
    public <D> D map(Object source, Class<D> destinationType) {
        Object tmpSource = source;
        if(source == null){
            tmpSource = new Object();
        }

        return super.map(tmpSource, destinationType);
    }
}

它检查source是否为null,在这种情况下,它将初始化然后调用super map(Object source, Class<D> destinationType)

最后,您可以像这样使用自定义的映射器:

public static void main(String args[]){
    //Your customized mapper
    ModelMapper modelMapper = new MyCustomizedMapper();

    MySource src = null;
    MyTarget trg = modelMapper.map(src, MyTarget.class); //trg = null
    System.out.println(trg);
}

输出将是new MyTarget()

输出控制台:NullExampleMain.MyTarget(fieldA = null,fieldB = null)

这样就被初始化了。



 类似资料:
  • 问题内容: 我想使用ModelMapper将实体转换为DTO并返回。通常,它可以工作,但是如何自定义它。它有太多选择,因此很难弄清楚从哪里开始。最佳做法是什么? 我会在下面亲自回答,但如果另一个答案更好,我会接受。 问题答案: 首先这是一些链接 modelmapper入门 API文档 博客文章 随机代码示例 我对mm的印象是它的设计很好。该代码很扎实,阅读起来很愉快。但是,该文档非常简洁,仅包含很

  • 我正在尝试使用ModelMapper映射对象树。 我创建了一个例子来说明我的问题: 类包含多个属性 类包含类型为Sub的对象和(至少)另一个属性 类目标包含一个简单的属性列表 源属性和目标属性的类型不同 代码: 我正在寻找一种配置单个ModelMapper实例的方法,以便满足以下约束: modelMapper能够将Sub类型的对象转换为目标对象 不幸的是,行<代码>映射(source.sub,de

  • 我使用ModelMapper将模型转换为DTO。我有一堆空值的默认转换器,它们已经在映射器级别注册,如下所示: 当转换的两侧的属性名称相同时,这可以很好地处理简单映射。转换器用于按预期处理空值。 现在,如果我需要使用不同的属性名称进行更复杂的转换。map(getter,setter)在类型映射上,不再调用全局转换器。我不想在配置typemap时丢弃全局转换器。 我怎样才能解决这个问题? 下面是使用

  • 使用代替和代替 然后在请求属性中添加 但是当我在javascript中检索它时,我得到了jsonObject的值 我在我的项目中已经使用了下面的库,如果需要,可以使用任何新的库

  • 我有一个用例,其中我需要维护两组JSON输出,一组具有JSON属性的漂亮名称,另一组没有。所以我决定自定义ObjectMapper,以便它忽略字段上的@JSONProperty(“pretty name”)注释,而使用字段属性名。在本例中,希望得到以下JSON输出 具有漂亮名称的JSON输出如下所示 我的ObjectMapper配置代码如下所示 我看了一些其他的答案,但对我不起作用。我得到了一个N

  • 假设我有一个Employee类如下所示: 在Java中转换Json的最聪明的方法是什么? 或;