Mapstruct uses属性失效,未调用指定Mapper处理内部字段
MapStruct
uses 属性失效:自定义映射未被调用的解决方案 问题根源
- 集合映射的方法匹配缺失:你的
RoomEntity中participant是Set<ParticipantEntity>,RoomFullDto中对应List<ParticipantDto>。MapStruct生成集合映射时,会寻找单个ParticipantEntity→ParticipantDto的映射方法,但你给ParticipantMapper的entityToDto加了@Named("EntityToData")注解,导致默认匹配规则找不到这个方法,只能自动生成基础映射逻辑。 - 未明确指定使用命名映射方法:即使在
@Mapper(uses = ...)中引入了ParticipantMapper,如果没有在@Mapping里通过qualifiedByName指定调用哪个命名方法,MapStruct不会自动关联带@Named的方法。
解决方案
方案1:通过qualifiedByName明确指定映射方法
修改RoomMapper的映射注解,指定使用ParticipantMapper中命名为EntityToData和DataToEntity的方法,MapStruct会自动处理集合类型的转换:
@Mapper(uses = {ParticipantMapper.class}) public interface RoomMapper { RoomMapper INSTANCE = Mappers.getMapper(RoomMapper.class); @Mapping(target = "participant", source = "participant", qualifiedByName = "EntityToData") RoomFullDto entityToData(RoomEntity entity); @Mapping(target = "participant", source = "participant", qualifiedByName = "DataToEntity") RoomEntity dataToEntity(RoomFullDto entity); // 其他方法保持不变 }
方案2:移除@Named注解,让MapStruct自动匹配
如果不需要区分同名方法,可以去掉ParticipantMapper方法上的@Named注解,让MapStruct根据参数和返回值类型自动匹配单个对象的映射方法,集合映射会自动复用这些方法:
@Mapper public interface ParticipantMapper { ParticipantMapper INSTANCE = Mappers.getMapper(ParticipantMapper.class); @Mapping(target = "room.id", source = "roomId") @Mapping(target = "user.id", source = "userId") @Mapping(target = "nicknameInRoom", source = "username") ParticipantEntity dtoToEntity (ParticipantDto participantDto); @Mapping(target = "roomId", source = "room.id") @Mapping(target = "userId", source = "user.id") @Mapping(target = "username", source = "nicknameInRoom") ParticipantDto entityToDto (ParticipantEntity participantDto); }
这种情况下RoomMapper无需额外修改,uses属性会正常生效。
验证要点
- 确保
ParticipantMapper中的方法参数和返回值类型与RoomMapper中集合的泛型类型完全匹配(ParticipantEntity↔ParticipantDto)。 - 执行
mvn clean compile清理Maven缓存后重新编译,避免旧的生成代码干扰。
内容的提问来源于stack exchange,提问作者Sergey Gotsev
相关产品推荐
相关产品推荐

