@Condition badly implemented

Expected behavior

@condition should be a wrapper of the existing generated code (generated without this annotation). Not an overwritter of existing generated code.

Actual behavior

When using @condition, the generated code is rewritten which is bad (in comparison when not present). It needs to wrap it, not rewrite it.

Steps to reproduce the problem

  1. Create a classical mapper class :
@Mapper(componentModel = "spring", uses = {TaxeMapper.class})
public interface FormuleMapper {

       Formule formuleEntityToDTO(FormuleOption formule);
}
  1. Generated code :
@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2023-05-10T15:52:58+0200",
    comments = "version: 1.5.5.Final, compiler: javac, environment: Java 18.0.2.1 (Oracle Corporation)"
)
@Component
public class FormuleMapperImpl implements FormuleMapper {
@Override
    public Formule formuleEntityToDTO(FormuleOption formule) {
        if ( formule == null ) {
            return null;
        }

        Formule formule1 = new Formule();

        formule1.setId( formule.getId() );
        formule1.setNom( formule.getNom() );
        formule1.setCode( formule.getCode() );
        formule1.setOrdre( formule.getOrdre() );
        formule1.setCommentaire( formule.getCommentaire() );
        formule1.setFormuleAssemblage( formule.getFormuleAssemblage() );
        formule1.setProduit( produitToIdNom( formule.getProduit() ) );
        formule1.setTaxes( ligneTaxeSetToIdNomRepartitionList( formule.getTaxes() ) );
        formule1.setBrouillon( formule.isBrouillon() );
        formule1.setType( getTypeFormule( formule.getType() ) );
        if ( formule.getMinimumPrimeTechniquePure() != null ) {
            formule1.setMinimumPrimeTechniquePure( formule.getMinimumPrimeTechniquePure().doubleValue() );
        }
        return formule1;
    }
}

Steps above are OK. Now let's introduce @condition with generated code to compare :

@Mapper(componentModel = "spring", uses = {TaxeMapper.class})
public interface FormuleMapper {
  
    Formule formuleEntityToDTO(FormuleOption formule);

@Condition
    default boolean targetFormuleOptionNotNull(fr.cfdp.services.produit.model.entity.produit.FormuleOption targetFormuleOption) {
        return targetFormuleOption != null ;
    }
}
@Override
    public Formule formuleEntityToDTO(FormuleOption formule) {
        if ( formule == null ) {
            return null;
        }

        Formule formule1 = new Formule();

        if ( targetFormuleOptionNotNull( formule ) ) {
            formule1.setId( formule.getId() );
        }
        if ( targetFormuleOptionNotNull( formule ) ) {
            formule1.setNom( formule.getNom() );
        }
        if ( targetFormuleOptionNotNull( formule ) ) {
            formule1.setCode( formule.getCode() );
        }
        if ( targetFormuleOptionNotNull( formule ) ) {
            formule1.setOrdre( formule.getOrdre() );
        }
        if ( targetFormuleOptionNotNull( formule ) ) {
            formule1.setCommentaire( formule.getCommentaire() );
        }
        if ( targetFormuleOptionNotNull( formule ) ) {
            formule1.setFormuleAssemblage( formule.getFormuleAssemblage() );
        }
        if ( targetFormuleOptionNotNull( formule ) ) {
            formule1.setProduit( produitToIdNom( formule.getProduit() ) );
        }
        if ( targetFormuleOptionNotNull( formule ) ) {
            formule1.setTaxes( ligneTaxeSetToIdNomRepartitionList( formule.getTaxes() ) );
        }
        if ( targetFormuleOptionNotNull( formule ) ) {
            formule1.setBrouillon( formule.isBrouillon() );
        }
        if ( targetFormuleOptionNotNull( formule ) ) {
            formule1.setType( getTypeFormule( formule.getType() ) );
        }
        if ( targetFormuleOptionNotNull( formule ) ) {
            formule1.setMinimumPrimeTechniquePure( formule.getMinimumPrimeTechniquePure().doubleValue() );
        }
        return formule1;
    }

So can you explain this difference in generated code :

if ( formule.getMinimumPrimeTechniquePure() != null ) {
            formule1.setMinimumPrimeTechniquePure( formule.getMinimumPrimeTechniquePure().doubleValue() );
        }

become :

 if ( targetFormuleOptionNotNull( formule ) ) {
            formule1.setMinimumPrimeTechniquePure( formule.getMinimumPrimeTechniquePure().doubleValue() );
        }

Which ends with a NullPointerException in my unit tests.

Thanks for lookup source problem.

MapStruct Version

1.5.5.Final