防止 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 在自动映射器检测中使用方法的主要内容,如果未能解决你的问题,请参考以下文章