我有以下实体
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/