Model Mapper должен отображать только первую запись в списке - PullRequest
0 голосов
/ 31 января 2020

У меня есть следующие сущности

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)

Так что только первая запись модели списка будет назначена производителем.

Мое предыдущее решение состояло в том, что у меня был список ModelDto даже в DTO и я удалил все записи после индекса 0. Это было Хорошо, потому что ModelMapper отобразил дочерний элемент из Model в ModelDTO автоматически.

Но только Response не был так хорош:

  models: [
    {...}
  ]

, потому что он был отправлен как массив.

Нужен ли здесь пользовательский ModelMapper? Если да, то как его построить? Учебник действительно сложный. Нужен ли конвертер или TypeMap (или оба)?

1 Ответ

1 голос
/ 31 января 2020

Я не слишком знаком с 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);

...