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