MapStruct中@BeanMapping(qualifiedByName)传多值不生效如何解决
问题根因
MapStruct 中@BeanMapping(qualifiedByName = {"x","y","z"})的语义是查找同时匹配所有给定限定名的方法,而非依次调用匹配任意一个限定名的方法。你的三个后置方法各自仅带有一个@Named注解,不存在同时匹配x、y、z三个限定名的方法,因此不会被调用。
解决方案
- 方案1:无需指定限定符,自动调用所有匹配的后置方法
如果这三个@AfterMapping方法仅服务于当前dtoToEntity映射,直接移除三个方法上的@Named注解,同时删除@BeanMapping中的qualifiedByName配置即可。MapStruct会自动扫描所有参数匹配的后置方法,生成代码时依次全部调用。
调整后代码示例:
public abstract class EntityMapper{ public abstract Entity dtoToEntity(Dto dto); @AfterMapping public void methodX(Dto dto){ //implementation } @AfterMapping public void methodY(Dto dto){ //implementation } @AfterMapping public void methodZ(Dto dto){ //implementation } }
- 方案2:聚合后置方法,兼容多场景复用
如果三个后置方法还需要被其他映射方法单独或组合复用,可以新增一个聚合的后置方法,把三个逻辑封装到同一个带@Named的方法中:
public abstract class EntityMapper{ @BeanMapping(qualifiedByName = "xyz") public abstract Entity dtoToEntity(Dto dto); @Named("x") @AfterMapping public void methodX(Dto dto){ //implementation } @Named("y") @AfterMapping public void methodY(Dto dto){ //implementation } @Named("z") @AfterMapping public void methodZ(Dto dto){ //implementation } // 新增聚合方法 @Named("xyz") @AfterMapping public void afterMappingAll(Dto dto){ methodX(dto); methodY(dto); methodZ(dto); } }
如果后续需要其他组合,比如仅调用x和y,再新增对应@Named("xy")的聚合方法即可。
内容的提问来源于stack exchange,提问作者filsoon
相关产品推荐
相关产品推荐

