繁体   English   中英

如何基于 containsKey 将值从映射映射到对象?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM