簡體   English   中英

MapStruct nullValueMappingStrategy 原語到 bean 返回默認 bean 而不是 null 值

[英]MapStruct nullValueMappingStrategy primitive to bean return default bean instead of null value

MapStruct 版本:1.4.1.Final

When I am trying to map an integer to a bean, when the integer is null the target is still being created as a default object instead of 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 無法知道源 object 的哪些屬性需要被視為執行映射的關鍵屬性。

為了實現您正在尋找的內容,您必須為其提供自己的映射方法。

例如

@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組件 model 時建議不要使用Mapper#getMapper

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM