模型映射器应仅映射列表的第一项

时间:2020-01-31 08:09:08

标签: java modelmapper

我有以下实体

public class Manufacturer
{
    int id;

    String name;

    Country country;

    List<Model> models;
}

public class Model
{
   int id;

   String name;
}

以及以下DTO

public class ManufacturerLastModelDto
{
    Integer id;

    String name;

    ModelDto model;
}

public class ModelDto
{
   int id;

   String name;
}

现在,我想将制造商映射到ManufacturerLastModelDto,就像这样:

modelMapper.map(manufacturer, ManufacturerLastModelDto.class)

因此只能从制造商那里分配列表模型的第一个条目。

我以前的解决方案是,我在DTO中具有偶数个ModelDto,并且删除了索引0之后的所有条目。这是可以的,因为ModelMapper会自动将子级从Model映射到ModelDTO。

但只有Response不太好:

  models: [
    {...}
  ]

因为它是作为数组发送的。

在这里需要自定义ModelMapper吗?如果是这样,怎么建呢?本教程非常复杂。我需要转换器还是TypeMap(或两者)?

1 个答案:

答案 0 :(得分:1)

我对ModelMapper不太熟悉,但偶尔使用它。

是的,您需要为该属性创建一个转换器,并且可以将其与ModelMapper或TypeMap一起使用。唯一需要注意的是,您将需要自己映射属性,例如

转换器

Converter<List<Model>, ModelDto> modelConverter = new AbstractConverter<List<Model>, ModelDto>() {
            @Override
            protected ModelDto convert(List<Model> models) {
                if (models == null || models.isEmpty()) {
                    return null;
                }
                Model model = models.get(0);
                ModelDto dto = new ModelDto();
                dto.setId(model.getId());
                dto.setName(model.getName());
                return dto;
            }
        };

现在使用默认的模型映射器

ModelMapper modelMapper = new ModelMapper();
modelMapper.addConverter(modelConverter);

ManufacturerLastModelDto result = modelMapper.map(manufacturer, ManufacturerLastModelDto.class);

或使用TypeMap

TypeMap<Manufacturer, ManufacturerLastModelDto> typeMap = modelMapper.typeMap(Manufacturer.class, ManufacturerLastModelDto.class)
                .addMappings(mapper ->
                        mapper.using(modelConverter).map(Manufacturer::getModels, ManufacturerLastModelDto::setModel)
                );

ManufacturerLastModelDto result = typeMap.map(manufacturer);