MapStruct nullValueMappingStrategy原语到bean返回默认bean,而不是null值



MapStruct版本:1.4.1.最终

当我试图将一个整数映射到一个bean时,当整数为null时,目标仍然被创建为默认对象,而不是null

@Mapper(componentModel = "spring", nullValueMappingStrategy = NullValueMappingStrategy.RETURN_NULL, nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.SET_TO_NULL)
public interface CompanyMapper { // NOSONAR
CompanyMapper INSTANCE = Mappers.getMapper(CompanyMapper.class);
@Mapping(source = "parentId", target = "parent.id")
Company toEntity(RequestCompany request);
}

代码生成

@Override
public Company toEntity(RequestCompany request) {
if ( request == null ) {
return null;
}
CompanyBuilder company = Company.builder();
company.parent( requestCompanyToCompany( request ) );
// Removed for simplicity
return company.build();
}

protected Company requestCompanyToCompany(RequestCompany requestCompany) {
if ( requestCompany == null ) {
return null;
}
CompanyBuilder company = Company.builder();

// Should verify if the parentId is null and 
// return null if condition is met
company.id( requestCompany.getParentId() );
return company.build();
}

编辑:与相关https://github.com/mapstruct/mapstruct/issues/1166#issuecomment-353742387

这可以按预期工作。MapStruct不知道源对象的哪些属性需要被视为执行映射的关键属性。

为了实现你正在寻找的东西,你必须提供自己的映射方法。

例如

@Mapper(componentModel = "spring", nullValueMappingStrategy = NullValueMappingStrategy.RETURN_NULL, nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.SET_TO_NULL)
public interface CompanyMapper { // NOSONAR
default Company toEntity(RequestCompany request) {
if (request == null || request.getParentId() == null) {
return null;
}
return toEntity2(request);
}

@Named("ignoreForOtherMethods")
@Mapping(source = "parentId", target = "parent.id")
Company toEntity2(RequestCompany request);
}

注意:在使用spring组件模型时,建议不要使用Mapper#getMapper

最新更新