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

Posted

技术标签:

【中文标题】防止 Mapstruct 在自动映射器检测中使用方法【英文标题】:Prevent Mapstruct from using a method in automatic mapper detection 【发布时间】:2022-01-16 22:46:28 【问题描述】:

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

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

如果我在@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


【问题讨论】:

【参考方案1】:

为了使方法仅用于特定用例,需要使用来自org.mapstruct@Named 或同样来自org.mapstruct 的自定义@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;



【讨论】:

以上是关于防止 Mapstruct 在自动映射器检测中使用方法的主要内容,如果未能解决你的问题,请参考以下文章

MapStruct使用说明

3.2Adding custom methods to mappers(在映射器中添加自定义方法)

mapstruct使用指南

使用自动映射器映射对象列表

无法使用自动映射器映射内部导航属性。 EF 核心

如何在使用自动映射器时将属性名称的 jsonproperty 设置为 dto?