防止 Mapstruct 在自动映射器检测中使用方法

Prevent Mapstruct from using a method in automatic mapper detection

我有一个 Mapstruct 映射器,我必须在其中执行一些字符串转换服务。即,从自然语言短语列表到实用程序 class 中定义的不透明常量。不,这次我不会使用枚举。它涉及一些 Levenshtein 检查预定义的措辞列表。

我在 Spring bean 中有一个方法 String getSyntheticDescription(String description),我想用它来映射我的 DTO 中的 单个 字符串字段。

如果我在 @Mapping 中使用 Mapstruct 的 uses 属性,我发现 Mapstruct 会滥用 definedBean.getSyntheticDescription 所有字符串转换。基本上每一个String字段映射到一个String都会传递给definedBean.getSyntheticDescription,这显然不是我想要的

我只想在单个字段的 expression 属性中使用它。

如何告诉 Mapstruct 不要尝试使用所有可用的映射方法并特别忽略 getSyntheticDescription,除非另有指示?

代码

@Mapper(componentModel = "spring", uses = {TaxonomyStringParser.class, TaxonomyCustomerLogic.class})
public interface TaxonomyControlMapping {

    @Mapping(target = "notcompliant", source = "nonConforme")
    @Mapping(target = "withurgency", source = "nonConformeConCriticita")
    @Mapping(target = "compliant", source = "conforme")
    @Mapping(target = "perimeter", expression = "java(taxonomyCustomerLogic.getControlPerimeterValueFromDescription(dto.getPerimetroAnalisi()))")
    @Mapping(target = "sampling", source = "campionamento")
    @Mapping(target = "performer", source = "performer")
    TaxonomyControlVersion fromMasterDbDto(TaxonomyControlMasterDbDTO dto) throws ParseException;


}

结果

        taxonomyControlVersion.setInstructions( taxonomyCustomerLogic.getControlPerimeterValueFromDescription( dto.getIndicazioniValutazione() ) );
        taxonomyControlVersion.setSignificance( taxonomyCustomerLogic.getControlPerimeterValueFromDescription( dto.getSignificativita() ) ); //BAD
        taxonomyControlVersion.setSamplingmode( taxonomyStringParser.parseSamplingModeType( dto.getModalitaCampionamento() ) ); //BAD

        taxonomyControlVersion.setPerimeter( taxonomyCustomerLogic.getControlPerimeterValueFromDescription(dto.getPerimetroAnalisi()) ); //GOOD


为了使方法仅在特定用例中使用,需要用 org.mapstruct 中的 @Named 或 [=12= 中的自定义 @Qualifier 进行注释].

在您的情况下,您可以将 @Named("syntheticDescription") 添加到 Spring bean 中的方法,然后使用 Mapping#qualifiedByName.

例如

@Mapper(componentModel = "spring", uses = {TaxonomyStringParser.class, TaxonomyCustomerLogic.class})
public interface TaxonomyControlMapping {

    @Mapping(target = "notcompliant", source = "nonConforme")
    @Mapping(target = "withurgency", source = "nonConformeConCriticita")
    @Mapping(target = "compliant", source = "conforme")
    @Mapping(target = "perimeter", source = "perimetroAnalisi" qualifiedByName = "syntheticDescription" )
    @Mapping(target = "sampling", source = "campionamento")
    @Mapping(target = "performer", source = "performer")
    TaxonomyControlVersion fromMasterDbDto(TaxonomyControlMasterDbDTO dto) throws ParseException;


}