java - 模型映射器应该只映射列表的第一个条目
问题描述
我有以下实体
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(或两者都需要)?
解决方案
我对 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 - 为mingw / ios / linus /其他源集导入java lib的解决方法?
- html - 将其定位为绝对后,我的 div 消失了
- android - 无法从 Google Play 控制台中的实时开发人员通知发送测试通知
- java - MediaPlayer.create(this,audio_file)
- delphi - 无法使用 Delphi Indy 控件连接到 https 站点
- php - 将数组排序为升序
- python - 不同场景的随机浮点数
- spring-webflux - 如何在 Spring Webflux / RSocket 中负载平衡通道
- r - 如何将不整洁的列表翻译成整洁的数据框?
- selenium - 使用 Selenium WebDriver 清除浏览器缓存和历史记录