GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — @Condition badly implemented · Issue #3270 · mapstruct/mapstruct

@Condition badly implemented  #3270

New issue
Copy link
New issue
Copy link
Closed
#3543
Closed
@Condition badly implemented #3270
#3543
Copy link
Labels
bug
Milestone
1.6.0.Beta2

Description

@fraf
fraf
opened on May 10, 2023
Issue body actions

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

  1. fraf
    added
    bug
    on May 10, 2023
  2. filiphr commented on May 10, 2023

    @filiphr
    filiphr
    on May 10, 2023
    Member
    More actions

    This has the same root cause as #3209. What you are trying to check is whether the source parameter is null this is not yet supported and should be done with #2610.

    It seems like we will have to force the use of @TargetProperty for non java types

  3. filiphr
    added this to the 1.6.0 milestone on May 10, 2023
  4. filiphr
    modified the milestones: 1.6.0.Beta1, 1.6.0.Beta2 on Nov 4, 2023
  5. filiphr
    added a commit that references this issue on Apr 29, 2024

    #2610 Add support for conditions on source parameters + fix incorrect…

    0a2a0aa
  6. filiphr
    closed this as completedin #3543on Apr 29, 2024
  7. filiphr commented on Apr 29, 2024

    @filiphr
    filiphr
    on Apr 29, 2024
    Member
    More actions

    @fraf with #3543 we've added support for condition checks on source parameters.

    So in your case you'll do something like:

    @Mapper(componentModel = "spring", uses = {TaxeMapper.class})
    public interface FormuleMapper {
      
        Formule formuleEntityToDTO(FormuleOption formule);
    
        @SourceParameterCondition
        default boolean targetFormuleOptionNotNull(fr.cfdp.services.produit.model.entity.produit.FormuleOption targetFormuleOption) {
            return targetFormuleOption != null ;
        }
    }

    This would then only apply for checking the source parameter and won't be done for the properties. It should look something like:

        @Override
        public Formule formuleEntityToDTO(FormuleOption formule) {
            if ( !targetFormuleOptionNotNull( formule ) ) {
                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;
    
        }
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

    bug

    Type

    No type

    Projects

    No projects

      Milestone

      • 1.6.0.Beta2

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      You are visitor 01402503 — GeezerVison does not store the pages you look up.
      Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.