Skip to content

@Condition badly implemented  #3270

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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