如何用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
相关产品推荐
相关产品推荐

