Как отобразить значения от карты к объекту на основе containsKey? - PullRequest
0 голосов
/ 01 марта 2019

У меня есть карта значений примерно так:

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

1 Ответ

0 голосов
/ 02 марта 2019

MapStruct не может сделать это "из коробки".

Однако вы можете обернуть свою Карту в Бин.Итак, что-то вроде этого:

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 на вашу цель и использовать NullValuePropertyMappingStrategy ..

Примечание: ваш маппер намного прощечем хорошо ..


@Mapper( nullValuePropertyMappingStrategy = NullValueProperertyMappingStrategy.IGNORE )
interface MyMapper {

    To get(MapAccessor from, @MappingTarget To to);
}

...