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

时间:2019-03-01 13:28:13

标签: java mapstruct

我有一个这样的值图:

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);
}

1 个答案:

答案 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);
}