升级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
相关产品推荐
相关产品推荐

