java - 模型映射器应该只映射列表的第一个条目

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

现在我想将Manufacturer映射到ManufacturerLastModelDto,就像这样:

modelMapper.map(manufacturer, ManufacturerLastModelDto.class)

这样,制造商只会分配列表模型的第一个条目。

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

但只有响应不太好:

  models: [
    {...}
  ]

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

我这里需要自定义 ModelMapper 吗?如果可以的话,如何构建呢?教程确实很复杂。我需要转换器或 TypeMap(或两者)吗?

最佳答案

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

关于java - 模型映射器应该只映射列表的第一个条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60000085/

相关文章:

java - 如何将 DTO 映射到现有的 JPA 实体?

java - 从多平面对象到层次结构对象的 ModelMapper 映射

java - 如何设置 ModelMapper 来嵌套到不同的嵌套?

java - 管道文件消失但仍然有效

java - 在 Netbeans 7.4 中保存时部署

java - 空列表和空列表有什么区别?

java - 如何使用 Modelmapper 从另一个对象更新对象字段

java - 使用 ModelMapper 时,如何为源类上的特定属性指定自定义映射?

java - macOS 上的 AudioInputStream : Pop noise with Java 1. 7 和 1.8 以及 8 位 wav 文件

java - 如何使使用全局动态属性的代码可进行单元测试?