ModelMapper сглаживает свойство массива (get (0)) до строки?

Объект Src имеет свойство:

private List<Pojo> goals;

Целевой объект имеет свойство

private String goal;

Я хочу сопоставить Src.goals.get(0).getName() -> Dest.goal. цели всегда будут содержать один элемент, но его нужно вытащить в виде списка, потому что он исходит от Neo4j.

Я пытался сделать:

    userTypeMap.addMappings(mapper -> {
        mapper.map(src -> src.getGoals().get(0).getName(), UserDto::setGoal);
    });

Но modelmapper не понравился параметр. Затем я попробовал:

    userTypeMap.addMappings(mapper -> {
        mapper.map(src -> src.getGoals(), UserDto::setGoal);
    });

И это дало мне:

"goal": "[org.xxx.models.Goal@5e0b5bd8]",

Затем я попытался добавить преобразователь для List -> String, но это не вызвало. Если я добавлю преобразователь для всего pojo в dto, то мне придется отобразить все pojo, чего я не хочу делать, я просто хочу переопределить это одно свойство.


person SledgeHammer    schedule 20.12.2019    source источник


Ответы (2)


Вы можете обернуть доступ List в Converter и использовать его в PropertyMap следующим образом:

ModelMapper mm = new ModelMapper();
Converter<List<Pojo>, String> goalsToName = 
    ctx -> ctx.getSource() == null ? null : ctx.getSource().get(0).getName();
PropertyMap<Src, Dest> propertyMap = new PropertyMap<>() {
    @Override
    protected void configure() {
        using(goalsToName).map(source.getGoals()).setGoal(null);
    }
};
mm.addMappings(propertyMap);
person ldz    schedule 20.12.2019
comment
ОТЛИЧНО! Работал как шарм. Спасибо! - person SledgeHammer; 21.12.2019

Я не совсем уверен, чего вы пытаетесь избежать с помощью этого:

Если я добавлю преобразователь для всего pojo в dto, то мне придется отобразить все pojo, чего я не хочу делать, я просто хочу переопределить это одно свойство.

Если вам нужно сопоставить все «pojo» или нужно сопоставить только одно поле, создайте конвертер, например:

Converter<HasListOfPojos, HasOnePojo> x = new Converter<>() {
    ModelMapper mm2 = new ModelMapper();
    @Override
    public HasOnePojo convert(MappingContext<HasListOfPojos, HasOnePojo> context) {
        // do not create a new mm2 and do this mapping if no need for other
        // fields, just create a new "hop"
        HasOnePojo hop = mm2.map(context.getSource(), HasOnePojo.class);
        // here goes the get(0) mapping
        hop.setGoal(context.getSource().getGoals().get(0));
        return hop;
    }
};
person pirho    schedule 20.12.2019