ModelMapper中TypeMap的使用方法

How to use TypeMap in ModelMapper

我有一种情况,如果值为 null,json 负载会发生变化。

例如下面的日期对象有三个对象(年、月、日)。 如果没有像“day”这样的数据,'value' 将不会显示,它只是空值。

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

我有很多 if 条件来检查这些空值,但看起来不太好。

所以现在我正在考虑使用 ModelMapper。

这就是我目前所拥有的。我认为开箱即用的一些属性会 处理 null 但我猜不是因为有效负载在 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...

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?

您应该简单地将 Conditional 映射配置为 仅在 isNotNull 条件匹配时应用

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