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
- Create a classical mapper class :
@Mapper(componentModel = "spring", uses = {TaxeMapper.class})
public interface FormuleMapper {
Formule formuleEntityToDTO(FormuleOption formule);
}
- 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
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
Steps above are OK. Now let's introduce @condition with generated code to compare :
So can you explain this difference in generated code :
become :
Which ends with a NullPointerException in my unit tests.
Thanks for lookup source problem.
MapStruct Version
1.5.5.Final