Modelmapper: Как применить пользовательское отображение, когда исходный объект является нулевым?

Предположим, у меня есть класс MySource:

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

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

и я хотел бы перевести его на объект 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()]

Кто-нибудь знает, как написать соответствующий конвертер для достижения этой цели?

1 ответ

Решение

Невозможно использовать ModelMapper напрямую, потому что ModelMapper map(Source, Destination) Метод проверяет, является ли источник нулевым, в этом случае он вызывает исключение...

Взгляните на реализацию метода Map MapMapper:

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

Это проверяет, является ли источник нулевым, в этом случае это инициализирует тогда, это вызывает супер 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)

Таким образом это инициализируется.

Другие вопросы по тегам