MapStruct无法拼接两个字段求助:仅获取到FirstName值
问题解决方法
你遇到的问题根源在于toDto方法中同时存在冲突的配置:@Mapping先给userName赋值为user.firstName,后续的@AfterMapping逻辑被覆盖或未正确生效。以下是两种可行的解决方式:
方案一:移除冲突的@Mapping配置
删除@Mapping( target = "userName", source = "user.firstName")这一行,让@AfterMapping完全负责userName的拼接逻辑,同时建议增加空指针判断避免异常:
@Mapper(componentModel = "spring") public interface PostDtoMapper { Post toEntity(PostDto source); @Mapping(ignore = true, source = "user", target = "user") PostDto toDto(Post destination); @AfterMapping default void toDto(@MappingTarget PostDto postDto, Post post) { User user = post.getUser(); if (user != null) { postDto.setUserName(user.getFirstName() + " " + user.getLastName()); } } }
方案二:直接使用expression实现拼接
无需@AfterMapping,在@Mapping中通过表达式直接完成字段拼接,代码更简洁:
@Mapper(componentModel = "spring") public interface PostDtoMapper { Post toEntity(PostDto source); @Mapping(ignore = true, source = "user", target = "user") @Mapping(target = "userName", expression = "java(destination.getUser() != null ? destination.getUser().getFirstName() + \" \" + destination.getUser().getLastName() : null)") PostDto toDto(Post destination); }
内容的提问来源于stack exchange,提问作者user21263160
相关产品推荐
相关产品推荐

