首页 > 解决方案 > 模型映射器应该只映射列表的第一个条目

问题描述

我有以下实体

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

现在我想将制造商映射到制造商LastModelDto,如下所示:

modelMapper.map(manufacturer, ManufacturerLastModelDto.class)

这样只有列表模型的第一个条目将由制造商分配。

我之前的解决方案是,即使在 DTO 中我也有一个 ModelDto 列表,并删除了索引 0 之后的所有条目。这没关系,因为 ModelMapper 自动将子节点从 Model 映射到 ModelDTO。

但只有 Response 不太好:

  models: [
    {...}
  ]

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

我需要一个自定义的 ModelMapper 吗?如果是这样,如何构建它?教程真的很复杂。我需要转换器还是 TypeMap(或两者都需要)?

标签: javamodelmapper

解决方案


我对 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);


推荐阅读