ModelMapper将数组属性(get(0))展平为String?

时间:2019-12-20 20:17:35

标签: java modelmapper

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,我只想覆盖此属性。

2 个答案:

答案 0 :(得分:1)

您可以将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);

答案 1 :(得分:0)

我不太确定您要避免这种情况:

  

如果我将整个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;
    }
};