我有一个这样的值图:
Map<String, Object> values = Map.of("name", "myName", "address", null);
我要更新这样的对象:
class User {
String name;
String address;
String country;
}
现在,如果源映射已定义键,则我只希望覆盖User
中的字段 。因此,address
字段应该设置为null(因为存在到null的显式映射),但是country
字段不应更改(因为映射中没有"country"
键)。
这与nullValuePropertyMappingStrategy = IGNORE
的操作类似,但不完全相同,因为该检查是map.containsKey
检查而不是标准的空检查。
我可以扩展MapStruct来做到这一点吗?
我的MapStruct代码:
@Mapper
interface MyMapper {
@Mapping(target = "name", expression = "java( from.getMap().get(\"name\") )")
@Mapping(target = "address", expression = "java( from.getMap().get(\"address\") )")
@Mapping(target = "country", expression = "java( from.getMap().get(\"country\") )")
To get(MapWrapper from, @MappingTarget To to);
}
答案 0 :(得分:2)
MapStruct无法开箱即用。
但是,您可以将Map包装到Bean中。像这样:
public class MapAccessor{
private Map<String, Object> mappings;
public MapAccessor(Map<String, Object> mappings) {
this.mappings = mappings;
}
public Object getAddress(){
return this.mappings.get("address");
}
public boolean hasAddress(){
return this.mappings.containsKey("address");
}
...
}
然后您可以使用普通映射器将WrappedMap
映射到目标bean并使用NullValuePropertyMappingStrategy
。
注意:您的映射器也要简单得多。
@Mapper( nullValuePropertyMappingStrategy = NullValueProperertyMappingStrategy.IGNORE )
interface MyMapper {
To get(MapAccessor from, @MappingTarget To to);
}