使用MapStruct更新Bean实例时忽略字段失效问题求助
MapStruct集合更新时忽略ID无效的解决方案
问题核心:MapStruct处理集合更新时,集合方法上的@Mapping注解不会传递到内部的单个对象映射逻辑。你直接在updateUsersFromDto上配置忽略ID,MapStruct生成的代码里,循环更新每个User时用的是自动生成的单对象更新方法,这个自动方法并没有继承你在集合方法上的忽略规则,所以ID还是会被覆盖。
解决步骤:
- 先定义单个对象的更新映射方法,在这个方法上配置ID忽略规则:
@Mapping(target = "id", ignore = true) void updateUserFromDto(UserDto dto, @MappingTarget User entity);
- 集合更新方法保持简洁,不需要加额外注解,MapStruct会自动调用上面的单对象方法处理每个元素:
void updateUsersFromDto(List<UserDto> dtos, @MappingTarget List<User> entities);
如果用@BeanMapping(ignoreByDefault = true)的场景,同样要把配置放在单对象方法上:
@BeanMapping(ignoreByDefault = true) // 只映射需要更新的字段,ID默认被忽略 @Mapping(target = "name", source = "name") @Mapping(target = "email", source = "email") void updateUserFromDto(UserDto dto, @MappingTarget User entity); void updateUsersFromDto(List<UserDto> dtos, @MappingTarget List<User> entities);
验证下生成的代码,会看到集合方法里循环调用单对象的updateUserFromDto,这样ID就不会被覆盖了。
内容的提问来源于stack exchange,提问作者Johannes Pertl
相关产品推荐
相关产品推荐

