Skip to content

@Condition badly implemented  #3270

@fraf

Description

@fraf

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions