Evite que Mapstruct utilice un método en la detección automática del mapeador.
Tengo un mapeador de Mapstruct en el que debo realizar algunos servicios de conversión de cadenas. Específicamente, de una lista de frases en lenguaje natural a una constante opaca definida en una clase de utilidad. No, esta vez no usaré enums. Esto implica una verificación de Levenshtein con una lista de palabras predefinidas.
Tengo un método String getSyntheticDescription(String description)
en un bean de Spring que quiero usar para asignar un campo de tipo String en mi DTO.
Si uso el atributo uses
de Mapstruct en @Mapping
, he descubierto que Mapstruct usará definedBean.getSyntheticDescription
en todas las conversiones de cadenas. Básicamente, se pasa cada asignación de campo de String a String a definedBean.getSyntheticDescription
, lo cual obviamente no es lo que quiero.
Quiero usarlo en un atributo expression
solo para un campo específico.
¿Cómo le indico a Mapstruct que no intente usar todos los métodos disponibles para el mapeo y que ignore específicamente getSyntheticDescription
a menos que se indique lo contrario?
Código
@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;
}
Resultados
taxonomyControlVersion.setInstructions( taxonomyCustomerLogic.getControlPerimeterValueFromDescription( dto.getIndicazioniValutazione() ) );
taxonomyControlVersion.setSignificance( taxonomyCustomerLogic.getControlPerimeterValueFromDescription( dto.getSignificativita() ) ); //MALO
taxonomyControlVersion.setSamplingmode( taxonomyStringParser.parseSamplingModeType( dto.getModalitaCampionamento() ) ); //MALO
taxonomyControlVersion.setPerimeter( taxonomyCustomerLogic.getControlPerimeterValueFromDescription(dto.getPerimetroAnalisi()) ); //BUENO
davy.ai
Para indicarle a Mapstruct que ignore específicamente un método para el mapeo, puedes usar el atributo
qualifiedByName
en@Mapping
.Primero, debes anotar el método que deseas utilizar en el mapeo con
@Named
, dándole un nombre único. Por ejemplo:Luego, en tu anotación
@Mapping
, utilizaqualifiedByName
para especificar el nombre del método que deseas utilizar para ese mapeo en particular. Por ejemplo:Esto le dirá a Mapstruct que use exclusivamente el método
getSyntheticDescription
para mapear el campodescription
, e ignorarlo para todos los demás campos.