防止 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;
}
我有一个 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;
}