Как использовать типовую карту в ModelMapper

#java #json #spring #spring-boot #modelmapper

Вопрос:

У меня есть ситуация, в которой полезная нагрузка json изменяется, если значение равно null.

Например, следующий объект даты содержит три объекта(год, месяц, день). Если нет данных, как в «дне», «значение» не будет отображаться, и оно будет просто равно нулю.

 "date":{
  "year":{
     "value":"2021"
  },
  "month":{
     "value":"09"
  },
  "day":null
 }
 

У меня была куча условий if, чтобы проверить наличие этих нулей, но это выглядело не очень хорошо.

Так что теперь я рассматриваю возможность использования ModelMapper.

Это то, что у меня есть до сих пор. Я думал, что некоторые свойства из коробки будут обрабатывать значение null, но я думаю, что нет, так как полезная нагрузка изменяется при нуле.

 private static MyDto mapData(Info info) {

ModelMapper modelMapper = new ModelMapper();   // relace -- MyCustomizedMapper

modelMapper.getConfiguration()
.setMatchingStrategy(MatchingStrategies.STRICT)
.setDeepCopyEnabled(true)
.setPropertyCondition(Conditions.isNotNull());

var mappedDto = modelMapper.map(info, MyDto.class);
mappedDto.setDay(info.getDay().getValue());
}
return mappedDto 

//nullPointerException is thrown because getDay is null 
 

Поэтому я попытался использовать настроенный картограф, который проверяет наличие null.

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

но я все равно получаю исключение нулевого указателя.

Я наткнулся на этот фрагмент кода на сайте картографа моделей и теперь пытаюсь использовать условие when(NotNull).

   typeMap.addMappings(mapper -> mapper.when(notNull).map(Person::getName, PersonDTO::setName));
 

Попытка использовать здесь типовую карту…

 TypeMap<Info, MyDto> typeMap =
    modelMapper.createTypeMap(Info.class, MyDto.class);

// Define the mappings on the type map
typeMap.addMappings(mapper -> {
  mapper.map(src -> src.getDay(),
      MyDto::setDay);
  mapper.when(Conditions.isNotNull()).skip(MyDto::setDay);
});
 

Ошибка: Свойства источника должны быть указаны при условном пропуске, пожалуйста, используйте вместо этого when().skip(sourceGetter, destinationSetter).

Как правильно использовать ModelMapper в этой ситуации?

Ответ №1:

Вы должны просто настроить Condition сопоставление al так, чтобы оно применялось только при isNotNull совпадении условий:

 TypeMap<Info, MyDto> typeMap = modelMapper.createTypeMap(Info.class, MyDto.class);
typeMap.addMappings(mapper -> {
    mapper.when(Condition.isNotNull()).map(Info::getDay, MyDto::setDay);
});