我有以下实体
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(或两者)?
答案 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);