You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 05:37:02