Mapstruct如何将零值(如BigDecimal.ZERO)视为NULL值?
MapStruct 零值/假值转NULL的实现方案
一、BigDecimal 转 String 的自定义处理
MapStruct 没有内置的一键配置能直接将BigDecimal.ZERO转为 null,需要通过自定义逻辑实现,常用两种方式:
1. 自定义转换方法(推荐)
在映射接口中编写默认方法,实现你的转换规则,MapStruct 会自动识别并使用该方法:
@Mapper public interface CustomMapper { CustomMapper INSTANCE = Mappers.getMapper(CustomMapper.class); default String bigDecimalToString(BigDecimal source) { if (source == null || source.signum() == 0) { return null; } return source.toString(); } // 其他映射逻辑,例如实体转DTO TargetDto mapToTarget(SourceEntity source); }
2. 单个字段的表达式映射
如果只是个别字段需要特殊处理,也可以在@Mapping中直接用 SpEL 表达式实现:
@Mapper public interface CustomMapper { CustomMapper INSTANCE = Mappers.getMapper(CustomMapper.class); @Mapping(target = "targetStringField", expression = "java(source.getBigDecimalField() == null || source.getBigDecimalField().signum() == 0 ? null : source.getBigDecimalField().toString())") TargetDto mapToTarget(SourceEntity source); }
二、JavaScript数值假值转NULL的处理
针对 JS 假值(0、""、false、undefined 等)转 Java null 的需求,分场景处理:
- 若在后端接收请求阶段处理:可在 DTO 的 setter 方法中添加判断逻辑,或自定义 Spring 类型转换器
Converter,将前端传入的假值转为 null 后再交给 MapStruct。 - 若直接通过 MapStruct 处理数值类型:同样用自定义方法实现假值转 null 的逻辑:
default Integer jsLikeNumberToInteger(Integer source) { // 模拟JS假值逻辑:0、null均转为null return (source == null || source == 0) ? null : source; }
总结
MapStruct 没有内置配置直接满足你的需求,必须通过自定义转换方法或SpEL表达式映射实现,其中自定义方法复用性更强,更适合多字段场景。
内容的提问来源于stack exchange,提问作者MatterOfFact
相关产品推荐
相关产品推荐

