如何配置MapStruct在源字段为空时使用另一源对象?
MapStruct 多源对象映射优先级配置方案
针对你需要优先取BlueBookCar的color,为空时 fallback 到AutoTraderCar的carColor的需求,有两种常用的MapStruct配置方式:
方式一:直接使用表达式实现
在@Mapping注解的expression属性中写入三元判断逻辑,MapStruct会直接生成对应的Java代码:
@Mapping(target = "color", expression = "java(blueBookCar.getColor() != null ? blueBookCar.getColor() : autoTraderCar.getCarColor())") public abstract CombinedCar from(BlueBookCar blueBookCar, AutoTraderCar autoTraderCar);
该方式代码简洁,适合简单的优先级判断逻辑,表达式中可直接引用方法参数名。
方式二:自定义默认方法(更易维护)
如果需要更清晰的逻辑拆分或后续扩展,可以在映射接口中定义默认方法处理颜色判断,再通过qualifiedByName指定使用该方法:
import org.mapstruct.Named; import org.mapstruct.Mapping; import org.mapstruct.Mapper; @Mapper public interface CarMapper { @Mapping(target = "color", source = ".", qualifiedByName = "resolveColor") CombinedCar from(BlueBookCar blueBookCar, AutoTraderCar autoTraderCar); @Named("resolveColor") default String resolveColor(BlueBookCar blueBookCar, AutoTraderCar autoTraderCar) { // 若需要处理空串,可替换为 StringUtils.isNotBlank(blueBookCar.getColor()) return blueBookCar.getColor() != null ? blueBookCar.getColor() : autoTraderCar.getCarColor(); } }
这种方式逻辑直观,便于调试和后续修改(比如新增空串过滤、默认值设置等),符合代码可维护性要求。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

