[英]Is there a way to use the containsKey() map function on an Object key?
[英]How to map values from map to object based on containsKey?
我有一个像这样的值映射:
Map<String, Object> values = Map.of("name", "myName", "address", null);
我想更新这样的对象:
class User {
String name;
String address;
String country;
}
现在我希望只有在源映射定义了键时才覆盖User
的字段。 所以address
字段应该设置为空(因为有一个显式映射到空),但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);
}
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
映射到你的 targetbean 并使用NullValuePropertyMappingStrategy
..
注意:您的映射器比同样简单得多。
@Mapper( nullValuePropertyMappingStrategy = NullValueProperertyMappingStrategy.IGNORE )
interface MyMapper {
To get(MapAccessor from, @MappingTarget To to);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.