java - 映射器未正确映射 - mapstruct
问题描述
我在使用 mapstruct 正确映射嵌套 dto 字段时遇到问题。我有几个 dto:
@Data
public class InstrumentGet {
.....
private MediaGet image;
private List<LocaleGet> locales;
}
@Data
public class LocaleGet {
private String name;
private String description;
private String iso6391;
private boolean defaultLanguage;
}
@Data
public class MediaGet {
private String uri;
private int width;
private int height;
}
使用相应的映射器
@Mapper(componentModel = "spring")
public interface LocaleMapper {
@Mapping(source = "culture.iso6391",target = "iso6391")
@Mapping(source = "culture.defaultLanguage",target = "defaultLanguage")
LocaleGet toDtoGet(BaseLocale locale);
List<LocaleGet> toDtosGet(List<BaseLocale> locales);
}
@Mapper( componentModel = "spring")
public interface MediaMapper {
MediaGet toDtoGet(Media media);
}
@Mapper(componentModel = "spring",uses = {MediaMapper.class, LocaleMapper.class})
public interface InstrumentMapper {
InstrumentGet instrumentToInstrumentGet(Instrument instrument, List<BaseLocale> locales);
}
到目前为止,一切正常,生成的代码自动连接其他需要的映射器以正确构建 dto。例如。生成的仪器映射器实现
@Component
public class InstrumentMapperImpl implements InstrumentMapper {
@Autowired
private MediaMapper mediaMapper;
@Autowired
private LocaleMapper localeMapper;
@Override
public InstrumentGet instrumentToInstrumentGet(Instrument instrument, List<BaseLocale> locales) {
if ( instrument == null && locales == null ) {
return null;
}
InstrumentGet instrumentGet = new InstrumentGet();
if ( instrument != null ) {
instrumentGet.setDefaultName( instrument.getDefaultName() );
instrumentGet.setImage( mediaMapper.toDtoGet( instrument.getImage() ) );
}
if ( locales != null ) {
instrumentGet.setLocales( localeMapper.toDtosGet( locales ) );
}
return instrumentGet;
}
}
现在我在尝试创建一个在其中嵌套了仪器 dto 的映射器时遇到了麻烦。映射器应使用 instrumentMapper 正确创建所需的 dto。dto:
@Data
public class MemberGet {
......
private MediaGet image;
private InstrumentGet instrument;
......
}
映射器:
@Mapper(componentModel = "spring",uses = {InstrumentMapper.class, MediaMapper.class})
public interface ClientMapper {
@Mapping(source = "member.band.uid",target = "bandUid")
MemberGet toDtoMemberGet(Member member, List<BaseLocale> locales);
}
生成的代码:
@Component
public class ClientMapperImpl implements ClientMapper {
@Autowired
private MediaMapper mediaMapper;
@Override
public MemberGet toDtoMemberGet(Member member, List<BaseLocale> locales) {
if ( member == null && locales == null ) {
return null;
}
MemberGet memberGet = new MemberGet();
if ( member != null ) {
memberGet.setBandUid( memberBandUid( member ) );
memberGet.setPersonDetails( member.getPersonDetails() );
memberGet.setBirthday( member.getBirthday() );
memberGet.setGender( member.getGender() );
memberGet.setImage( mediaMapper.toDtoGet( member.getImage() ) );
memberGet.setInstrument( instrumentToInstrumentGet( member.getInstrument() ) );
}
return memberGet;
}
private String memberBandUid(Member member) {
if ( member == null ) {
return null;
}
Band band = member.getBand();
if ( band == null ) {
return null;
}
String uid = band.getUid();
if ( uid == null ) {
return null;
}
return uid;
}
protected InstrumentGet instrumentToInstrumentGet(Instrument instrument) {
if ( instrument == null ) {
return null;
}
InstrumentGet instrumentGet = new InstrumentGet();
instrumentGet.setDefaultName( instrument.getDefaultName() );
instrumentGet.setImage( mediaMapper.toDtoGet( instrument.getImage() ) );
return instrumentGet;
}
}
现在媒体映射器被很好地拾取并使用所需的方法,我遇到了仪器映射器的问题,mapstruct 不会自动装配并调用所需的方法,而是创建自己的不适合我需要的方法。我显然在这里做错了什么。谁能给我一个提示或任何建议?
问候
解决方案
当直接从另一个映射器使用具有多个源参数的映射器时,mapstruct 存在限制。您可以通过删除引用的映射器的两个参数之一来自行测试它。
相反,您可以使用@BeforeMapping或@AfterMapping或装饰器来解决您的问题。
上下文参数也可能起作用。
推荐阅读
- javascript - Django:在数据库中存储一个 CSS 类
- c# - C# - 搜索dataGridView后保存按钮
- javascript - Discord.js 禁止命令中的无效表单正文
- youtube-livestreaming-api - 自 2020 年 10 月 1 日以来,Youtube liveStreams 插入出现错误
- angularjs - 已完成 500 INTERNAL_SERVER_ERROR SpringBoot Angular:OneToMany 问题
- node.js - 使用 sequelize 删除父级时如何软删除关联子行
- flutter - 构建我的应用程序时出现不推荐使用的错误
- r - 用 1-10 标记 10 年的数据,而不是 1955-1966
- api - clearMarkers() 和 addMarker() 不起作用
- ruby-on-rails - 在 Heroku 上部署 Rails 应用程序 - 图像在一段时间后消失