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?
您应该简单地将 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);
});
我有一种情况,如果值为 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?
您应该简单地将 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);
});