在 MapStruct 中使用多源对象设置默认值策略

Posted

技术标签:

【中文标题】在 MapStruct 中使用多源对象设置默认值策略【英文标题】:Setting Default Value Strategy with Multiple Source Object in MapStruct 【发布时间】:2022-01-06 17:09:46 【问题描述】:

我想对我的源对象的映射属性生成 null 检查,如果源属性确实为 null,则将其设置为默认值。

我尝试在 @Mapper 和 @Mapping 目标上使用 NullValuePropertyMappingStrategy.SET_TO_DEFAULT,但生成的代码不包含默认设置器。

所以基本上我想要实现的是:

@Mapper(componentModel = "spring")
public interface OperationDataMapper 

    OperationDTO from(Object 1 o1, Object2 o2);

这样我生成的代码就变成了:

@Component
public class OperationDataMapperImpl implements OperationDataMapper 

    @Override 
    public OperationDTO from(Object 1 o1, Object2 o2) 
        if ( o1 == null && o2 == null ) 
            return null;
        

        OperationDTO operationDTO = new OperationDTO();

        if ( o1 != null ) 
            if(o1.getProp1() != null) 
                operationDTO.setProp1( o1.getProp1() )
             else 
                operationDTO.setProp1( "" ) // if property is a string for example
            
            .
            .
        
    
        if ( o2 != null ) 
            if(o2.getProp2() != null) 
                operationDTO.setProp2( o2.getProp2() )
             else 
                operationDTO.setProp2( "" ) // if property is a string for example
            
            .
            .
        
    
        return operationDTO;
    

我没有像文档指出的那样使用默认值策略编写示例,因为我尝试使用空值映射嵌套属性时它不起作用。有趣的是,NullValueCheckStrategy 没有任何问题,但是NullValuePropertyMappingStrategy 没有。

我也尝试使用@BeanMapping 设置它们,但无济于事。

如果有人能指出我正确的方向,我将不胜感激!

【问题讨论】:

【参考方案1】:

NullValuePropertyMappingStrategy 用于更新映射。如果你想应用它,你必须提供 OperationDTO@MappingTarget

实现您所寻找的唯一方法是使用Mapping#defaultValueMapping#defaultExpression

【讨论】:

以上是关于在 MapStruct 中使用多源对象设置默认值策略的主要内容,如果未能解决你的问题,请参考以下文章

mapstruct对象复制&转换

Mapstruct官方参考文档中的一些使用规则

MapStruct在项目中封装使用

mapstruct使用指南

mapstruct对象转换工具

实体映射最强工具类:MapStruct 真香!