Mapper函数空参数检查

Mapper function null parameter check

我将 MapStruct 与 Lombok 和构建器模式结合使用。 我有一个问题,即 MapStruct 正在对生成的映射器函数内的所有参数进行显式空检查,并在所有参数为空的情况下提前退出,例如:

// Object A
@Value
@Builder(builderClassName = "Builder")
public class SourceA{
    private int a;
}

// Object B
@Value
@Builder(builderClassName = "Builder")
public class SourceB{
    private int a;
}

// Object C
@Value
@Builder(builderClassName = "Builder")
public class SourceC{
    private int a;
}

// Object Target
@Value
@Builder(builderClassName = "Builder")
public class Target{
    private int a;
    private int b;
    private int c;
}

// Mapper
@Mapper(componentModel = "spring")
public interface Mapper {

    @Mappings({
            @Mapping(target = "a", source = "sourceA.a"),
            @Mapping(target = "b", source = "sourceB.a"),
            @Mapping(target = "c", source = "sourceC.a")
    })
    Target toTarget(SourceA sourceA, SourceB sourceB, SourceC sourceC);
};

// mapstruct impl
// Auto Generated by MapStruct!
public class MapperImpl implements Mapper {
    public Target toTarget(SourceA sourceA, SourceB sourceB, SourceC sourceC){
        // Problamatic line
        if (sourceA == null && sourceB == null && sourceC == null) {
            return null;
        } else {
            Target.Builder builder = Target.builder();
            // map objects
            return builder.builder();
        }
    }
}

我想实现 MapStruct 没有实现完整的 null 检查。即使所有参数都为空,它也应该设置整个构建器,并在构建器进行空检查的最后调用构建(如果有的话)。

为了实现您正在寻找的目标,请始终创建您需要使用的目标对象的默认实例 NullValueMappingStrategy

在您的映射器上,您可以执行 @Mapper(nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT) 当您执行此操作时,生成的代码应如下所示:

public class MapperImpl implements Mapper {
    public Target toTarget(SourceA sourceA, SourceB sourceB, SourceC sourceC){

        Target.Builder builder = Target.builder();
        // map objects
        return builder.builder();
    }
}