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)
Таким образом это инициализируется.