Как отобразить значения от карты к объекту на основе 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);
}
1 ответ
MapStruct не может сделать это из коробки.
Тем не менее, вы можете обернуть свою карту в бин. Так что-то вроде этого:
public class MapAccessor{
private Map<String, Object> mappings;
public MapAccessor(Map<String, Object> mappings) {
this.mappings = mappings;
}
public getAddress(){
return this.mappings.get("address");
}
...
}
И тогда вы могли бы нормальный картограф WrappedMap
к вашей цели и используя NullValuePropertyMappingStrategy
..
Примечание: ваш картограф намного проще, чем также.
@Mapper( nullValuePropertyMappingStrategy = NullValueProperertyMappingStrategy.IGNORE )
interface MyMapper {
To get(MapAccessor from, @MappingTarget To to);
}