es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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
Tags:  

Answer

  1. Avatar for 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:

    @Named("syntheticDescription")
    String getSyntheticDescription(String description);
    

    Luego, en tu anotación @Mapping, utiliza qualifiedByName para especificar el nombre del método que deseas utilizar para ese mapeo en particular. Por ejemplo:

    @Mapping(target = "description", source = "syntheticDescription", qualifiedByName = "syntheticDescription")
    TaxonomyControlVersion fromMasterDbDto(TaxonomyControlMasterDbDTO dto) throws ParseException;
    

    Esto le dirá a Mapstruct que use exclusivamente el método getSyntheticDescription para mapear el campo description, e ignorarlo para todos los demás campos.

Comments are closed.