-
-
Notifications
You must be signed in to change notification settings - Fork 1k
Closed
Labels
Milestone
Description
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