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

升级MapStruct至1.3.1后@Mapper的NullValueCheckStrategy.ALWAYS失效,是否为bug?

MapStruct 1.3.1中@Mapper(nullValueCheckStrategy=ALWAYS)未生效的原因及解决方案

这不是新版本的bug,而是MapStruct 1.3.x版本引入的行为变更导致的,我来给你拆解清楚:

问题根源

在MapStruct 1.2.0中,当你设置nullValueCheckStrategy=NullValueCheckStrategy.ALWAYS时,框架默认只会在源值非空时执行目标属性赋值,空值时会直接跳过(相当于隐含了nullValuePropertyMappingStrategy=IGNORE的逻辑)。

但从1.3.x版本开始,MapStruct把空值检查逻辑和空值属性映射策略拆分成了两个独立的配置项:

  • nullValueCheckStrategy:仅控制是否对源值做空检查
  • nullValuePropertyMappingStrategy:控制源值为空时如何处理目标属性(默认值变更为NullValuePropertyMappingStrategy.SET_TO_NULL)

所以即便你开启了空检查,默认策略下空值时还是会生成else分支把目标属性设为null,这就出现了你看到的不符合预期的代码。

解决方案

只需要在@Mapper注解中同时指定nullValuePropertyMappingStrategy=NullValuePropertyMappingStrategy.IGNORE,就能恢复1.2.0版本的行为,得到你预期的代码:

@Mapper(
    nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS,
    nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE
)
public interface YourTestMapper {
    // 你的映射方法定义
}

配置完成后,生成的代码就会变成你期望的样子:

String id = getTestId(testId);
if ( id != null ) {
    testCase.setTestCaseId( id );
}

补充说明

如果你需要更细致的控制,MapStruct 1.3.x还支持在方法或属性级别单独配置这些策略,按需调整即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 00:07:49