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

如何用MapStruct实现对象解包?UserId转String映射问题

如何用MapStruct正确解包UserId record为String类型

我有一个UserId record类,需要通过MapStruct将其映射为String类型(暴露给API),但使用@Mapping(target = ".", source="userId.id")的配置生成了错误的代码(返回空字符串),需要正确的注解配置方式。

问题原因

MapStruct中target="."语法仅适用于目标为复杂对象的场景,用于将源对象的所有属性映射到目标对象的对应属性。当目标是String这类简单类型时,该语法不生效,MapStruct会默认初始化一个空的String实例返回,这就是你看到错误生成代码的原因。


解决方案

方案1:自动映射(推荐)

由于UserId是record类型,其id()方法是公共访问器,MapStruct可以自动识别并完成映射,无需额外注解:

@Mapper
public abstract class UserMapper {
    protected abstract String toApi(UserId userId);
}

生成的代码会自动处理null判断,并返回userId.id()的值:

@Override
protected String toApi(UserId userId) {
    if ( userId == null ) {
        return null;
    }

    String string = userId.id();

    return string;
}

方案2:显式指定返回值映射

如果需要显式声明映射关系,可以使用target="return"来指定返回值的数据源:

@Mapper
public abstract class UserMapper {
    @Mapping(source = "id", target = "return")
    protected abstract String toApi(UserId userId);
}

这种方式通过target="return"明确告诉MapStruct,将入参userId的id属性映射到方法的返回值,生成的代码和方案1一致。


你的自定义映射方法是可行的,但上述两种配置都可以让MapStruct自动生成正确的解包代码,无需手动实现。

内容的提问来源于stack exchange,提问作者Jochem Kuijpers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 12:04:54