Skip to content

Conditional mapping with @TargetPropertyName fails for nested update mappings #3809

@sdkrach

Description

@sdkrach

Expected behavior

The compilation to succeed.

Actual behavior

The following error is generated by MapStruct during compilation:

/*
@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2025-01-27T14:14:13+0100",
    comments = "version: 1.6.3, compiler: javac, environment: Java 21.0.5 (Eclipse Adoptium)"
)
*/
public class ClassMapperImpl implements ClassMapper {

    @Override
    public ClassB normalMappingWorks(ClassA source) {
        if ( source == null ) {
            return null;
        }

        ClassB classB = new ClassB();

        if ( canMap( source, "param" ) ) {
            classB.setParam( nestedClassAToNestedClassB( source.getParam() ) );
        }

        return classB;
    }

    @Override
    public void updateMappingFails(ClassA source, ClassB target) {
        if ( source == null ) {
            return;
        }

        if ( canMap( source, "FreeMarker template error (DEBUG mode; use RETHROW in production!): The following has evaluated to null or missing: ==> ext.targetPropertyName [in template "org/mapstruct/ap/internal/model/MethodReference.ftl" at line 50, column 16] ---- Tip: It's the step after the last dot that caused this error, not those before it. ---- Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${ext.targetPropertyName} [in template "org/mapstruct/ap/internal/model/MethodReference.ftl" in macro "arguments" at line 50, column 14] - Reached through: @arguments [in template "org/mapstruct/ap/internal/model/MethodReference.ftl" in macro "methodCall" at line 32, column 53] - Reached through: @methodCall [in template "org/mapstruct/ap/internal/model/MethodReference.ftl" at line 24, column 9] - Reached through: @compress single_line=true [in template "org/mapstruct/ap/internal/model/MethodReference.ftl" at line 9, column 1] ---- Java stack trace (for programmers): ---- org.mapstruct.ap.shaded.freemarker.core.InvalidReferenceException: [... Exception message was already printed; see it above ...] at org.mapstruct.ap.shaded.freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.java:134) at org.mapstruct.ap.shaded.freemarker.core.EvalUtil.coerceModelToTextualCommon(EvalUtil.java:481) at org.mapstruct.ap.shaded.freemarker.core.EvalUtil.coerceModelToStringOrMarkup(EvalUtil.java:401) at org.mapstruct.ap.shaded.freemarker.core.EvalUtil.coerceModelToStringOrMarkup(EvalUtil.java:370) at org.mapstruct.ap.shaded.freemarker.core.DollarVariable.calculateInterpolatedStringOrMarkup(DollarVariable.java:104) at org.mapstruct.ap.shaded.freemarker.core.DollarVariable.accept(DollarVariable.java:63) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:335) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:377) at org.mapstruct.ap.shaded.freemarker.core.IteratorBlock$IterationContext.executedNestedContentForCollOrSeqListing(IteratorBlock.java:291) at org.mapstruct.ap.shaded.freemarker.core.IteratorBlock$IterationContext.executeNestedContent(IteratorBlock.java:271) at org.mapstruct.ap.shaded.freemarker.core.IteratorBlock$IterationContext.accept(IteratorBlock.java:244) at org.mapstruct.ap.shaded.freemarker.core.Environment.visitIteratorBlock(Environment.java:645) at org.mapstruct.ap.shaded.freemarker.core.IteratorBlock.acceptWithResult(IteratorBlock.java:108) at org.mapstruct.ap.shaded.freemarker.core.IteratorBlock.accept(IteratorBlock.java:94) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:371) at org.mapstruct.ap.shaded.freemarker.core.Environment.invokeMacroOrFunctionCommonPart(Environment.java:877) at org.mapstruct.ap.shaded.freemarker.core.Environment.invokeMacro(Environment.java:813) at org.mapstruct.ap.shaded.freemarker.core.UnifiedCall.accept(UnifiedCall.java:84) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:335) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:377) at org.mapstruct.ap.shaded.freemarker.core.Environment.invokeMacroOrFunctionCommonPart(Environment.java:877) at org.mapstruct.ap.shaded.freemarker.core.Environment.invokeMacro(Environment.java:813) at org.mapstruct.ap.shaded.freemarker.core.UnifiedCall.accept(UnifiedCall.java:84) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:335) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:377) at org.mapstruct.ap.shaded.freemarker.core.Environment.visitAndTransform(Environment.java:502) at org.mapstruct.ap.shaded.freemarker.core.UnifiedCall.accept(UnifiedCall.java:104) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:335) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:341) at org.mapstruct.ap.shaded.freemarker.core.Environment.process(Environment.java:314) at org.mapstruct.ap.shaded.freemarker.template.Template.process(Template.java:383) at org.mapstruct.ap.internal.writer.FreeMarkerModelElementWriter.write(FreeMarkerModelElementWriter.java:35) at org.mapstruct.ap.internal.writer.FreeMarkerWritable.write(FreeMarkerWritable.java:19) at org.mapstruct.ap.internal.writer.ModelIncludeDirective.execute(ModelIncludeDirective.java:48) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:452) at org.mapstruct.ap.shaded.freemarker.core.UnifiedCall.accept(UnifiedCall.java:102) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:335) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:341) at org.mapstruct.ap.shaded.freemarker.core.Environment.process(Environment.java:314) at org.mapstruct.ap.shaded.freemarker.template.Template.process(Template.java:383) at org.mapstruct.ap.internal.writer.FreeMarkerModelElementWriter.write(FreeMarkerModelElementWriter.java:35) at org.mapstruct.ap.internal.writer.FreeMarkerWritable.write(FreeMarkerWritable.java:19) at org.mapstruct.ap.internal.writer.ModelIncludeDirective.execute(ModelIncludeDirective.java:48) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:452) at org.mapstruct.ap.shaded.freemarker.core.UnifiedCall.accept(UnifiedCall.java:102) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:335) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:341) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:377) at org.mapstruct.ap.shaded.freemarker.core.Environment.invokeNestedContent(Environment.java:621) at org.mapstruct.ap.shaded.freemarker.core.BodyInstruction.accept(BodyInstruction.java:60) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:335) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:377) at org.mapstruct.ap.shaded.freemarker.core.Environment.invokeMacroOrFunctionCommonPart(Environment.java:877) at org.mapstruct.ap.shaded.freemarker.core.Environment.invokeMacro(Environment.java:813) at org.mapstruct.ap.shaded.freemarker.core.UnifiedCall.accept(UnifiedCall.java:84) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:335) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:341) at org.mapstruct.ap.shaded.freemarker.core.Environment.process(Environment.java:314) at org.mapstruct.ap.shaded.freemarker.template.Template.process(Template.java:383) at org.mapstruct.ap.internal.writer.FreeMarkerModelElementWriter.write(FreeMarkerModelElementWriter.java:35) at org.mapstruct.ap.internal.writer.FreeMarkerWritable.write(FreeMarkerWritable.java:19) at org.mapstruct.ap.internal.writer.ModelIncludeDirective.execute(ModelIncludeDirective.java:48) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:452) at org.mapstruct.ap.shaded.freemarker.core.UnifiedCall.accept(UnifiedCall.java:102) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:335) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:341) at org.mapstruct.ap.shaded.freemarker.core.Environment.process(Environment.java:314) at org.mapstruct.ap.shaded.freemarker.template.Template.process(Template.java:383) at org.mapstruct.ap.internal.writer.FreeMarkerModelElementWriter.write(FreeMarkerModelElementWriter.java:35) at org.mapstruct.ap.internal.writer.FreeMarkerWritable.write(FreeMarkerWritable.java:19) at org.mapstruct.ap.internal.writer.ModelIncludeDirective.execute(ModelIncludeDirective.java:48) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:452) at org.mapstruct.ap.shaded.freemarker.core.UnifiedCall.accept(UnifiedCall.java:102) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:371) at org.mapstruct.ap.shaded.freemarker.core.IteratorBlock$IterationContext.executedNestedContentForCollOrSeqListing(IteratorBlock.java:291) at org.mapstruct.ap.shaded.freemarker.core.IteratorBlock$IterationContext.executeNestedContent(IteratorBlock.java:271) at org.mapstruct.ap.shaded.freemarker.core.IteratorBlock$IterationContext.accept(IteratorBlock.java:244) at org.mapstruct.ap.shaded.freemarker.core.Environment.visitIteratorBlock(Environment.java:645) at org.mapstruct.ap.shaded.freemarker.core.IteratorBlock.acceptWithResult(IteratorBlock.java:108) at org.mapstruct.ap.shaded.freemarker.core.IteratorBlock.accept(IteratorBlock.java:94) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:335) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:341) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:341) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:341) at org.mapstruct.ap.shaded.freemarker.core.Environment.process(Environment.java:314) at org.mapstruct.ap.shaded.freemarker.template.Template.process(Template.java:383) at org.mapstruct.ap.internal.writer.FreeMarkerModelElementWriter.write(FreeMarkerModelElementWriter.java:35) at org.mapstruct.ap.internal.writer.FreeMarkerWritable.write(FreeMarkerWritable.java:19) at org.mapstruct.ap.internal.writer.ModelIncludeDirective.execute(ModelIncludeDirective.java:48) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:452) at org.mapstruct.ap.shaded.freemarker.core.UnifiedCall.accept(UnifiedCall.java:102) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:371) at org.mapstruct.ap.shaded.freemarker.core.IteratorBlock$IterationContext.executedNestedContentForCollOrSeqListing(IteratorBlock.java:291) at org.mapstruct.ap.shaded.freemarker.core.IteratorBlock$IterationContext.executeNestedContent(IteratorBlock.java:271) at org.mapstruct.ap.shaded.freemarker.core.IteratorBlock$IterationContext.accept(IteratorBlock.java:244) at org.mapstruct.ap.shaded.freemarker.core.Environment.visitIteratorBlock(Environment.java:645) at org.mapstruct.ap.shaded.freemarker.core.IteratorBlock.acceptWithResult(IteratorBlock.java:108) at org.mapstruct.ap.shaded.freemarker.core.IteratorBlock.accept(IteratorBlock.java:94) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:335) at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:341) at org.mapstruct.ap.shaded.freemarker.core.Environment.process(Environment.java:314) at org.mapstruct.ap.shaded.freemarker.template.Template.process(Template.java:383) at org.mapstruct.ap.internal.writer.FreeMarkerModelElementWriter.write(FreeMarkerModelElementWriter.java:35) at org.mapstruct.ap.internal.writer.FreeMarkerWritable.write(FreeMarkerWritable.java:19) at org.mapstruct.ap.internal.writer.ModelWriter.writeModel(ModelWriter.java:69) at org.mapstruct.ap.internal.processor.MapperRenderingProcessor.createSourceFile(MapperRenderingProcessor.java:62) at org.mapstruct.ap.internal.processor.MapperRenderingProcessor.writeToSourceFile(MapperRenderingProcessor.java:39) at org.mapstruct.ap.internal.processor.MapperRenderingProcessor.process(MapperRenderingProcessor.java:29) at org.mapstruct.ap.internal.processor.MapperRenderingProcessor.process(MapperRenderingProcessor.java:24) at org.mapstruct.ap.MappingProcessor.process(MappingProcessor.java:400) at org.mapstruct.ap.MappingProcessor.processMapperTypeElement(MappingProcessor.java:380) at org.mapstruct.ap.MappingProcessor.processMapperElements(MappingProcessor.java:329) at org.mapstruct.ap.MappingProcessor.process(MappingProcessor.java:213) at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:1021) at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:937) at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1265) at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1380) at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1272) at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:946) at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.lambda$doCall$0(JavacTaskImpl.java:104) at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.invocationHelper(JavacTaskImpl.java:152) at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:100) at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:94) at org.codehaus.plexus.compiler.javac.JavaxToolsCompiler.compileInProcess(JavaxToolsCompiler.java:126) at org.codehaus.plexus.compiler.javac.JavacCompiler.performCompile(JavacCompiler.java:214) at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:1228) at org.apache.maven.plugin.compiler.CompilerMojo.execute(CompilerMojo.java:215) at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:126) at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2(MojoExecutor.java:328) at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute(MojoExecutor.java:316) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:212) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:174) at org.apache.maven.lifecycle.internal.MojoExecutor.access$000(MojoExecutor.java:75) at org.apache.maven.lifecycle.internal.MojoExecutor$1.run(MojoExecutor.java:162) at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute(DefaultMojosExecutionStrategy.java:39) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:159) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:105) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:73) at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:53) at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:118) at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:261) at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:173) at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:101) at org.apache.maven.cli.MavenCli.execute(MavenCli.java:906) at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:283) at org.apache.maven.cli.MavenCli.main(MavenCli.java:206) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:255) at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:201) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:361) at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:314) at org.codehaus.classworlds.Launcher.main(Launcher.java:41)FreeMarker template error (DEBUG mode; use RETHROW in production!):
The following has evaluated to null or missing:
==> ext.targetPropertyName  [in template "org/mapstruct/ap/internal/model/MethodReference.ftl" at line 50, column 16]

----
Tip: It's the step after the last dot that caused this error, not those before it.
----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

----
FTL stack trace ("~" means nesting-related):
	- Failed at: ${ext.targetPropertyName}  [in template "org/mapstruct/ap/internal/model/MethodReference.ftl" in macro "arguments" at line 50, column 14]
	- Reached through: @arguments  [in template "org/mapstruct/ap/internal/model/MethodReference.ftl" in macro "methodCall" at line 32, column 53]
	- Reached through: @methodCall  [in template "org/mapstruct/ap/internal/model/MethodReference.ftl" at line 24, column 9]
	- Reached through: @compress single_line=true  [in template "org/mapstruct/ap/internal/model/MethodReference.ftl" at line 9, column 1]
----

Java stack trace (for programmers):
----
org.mapstruct.ap.shaded.freemarker.core.InvalidReferenceException: [... Exception message was already printed; see it above ...]
	at org.mapstruct.ap.shaded.freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.java:134)
	at org.mapstruct.ap.shaded.freemarker.core.EvalUtil.coerceModelToTextualCommon(EvalUtil.java:481)
	at org.mapstruct.ap.shaded.freemarker.core.EvalUtil.coerceModelToStringOrMarkup(EvalUtil.java:401)
	at org.mapstruct.ap.shaded.freemarker.core.EvalUtil.coerceModelToStringOrMarkup(EvalUtil.java:370)
	at org.mapstruct.ap.shaded.freemarker.core.DollarVariable.calculateInterpolatedStringOrMarkup(DollarVariable.java:104)
	at org.mapstruct.ap.shaded.freemarker.core.DollarVariable.accept(DollarVariable.java:63)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:335)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:377)
	at org.mapstruct.ap.shaded.freemarker.core.IteratorBlock$IterationContext.executedNestedContentForCollOrSeqListing(IteratorBlock.java:291)
	at org.mapstruct.ap.shaded.freemarker.core.IteratorBlock$IterationContext.executeNestedContent(IteratorBlock.java:271)
	at org.mapstruct.ap.shaded.freemarker.core.IteratorBlock$IterationContext.accept(IteratorBlock.java:244)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visitIteratorBlock(Environment.java:645)
	at org.mapstruct.ap.shaded.freemarker.core.IteratorBlock.acceptWithResult(IteratorBlock.java:108)
	at org.mapstruct.ap.shaded.freemarker.core.IteratorBlock.accept(IteratorBlock.java:94)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:371)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.invokeMacroOrFunctionCommonPart(Environment.java:877)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.invokeMacro(Environment.java:813)
	at org.mapstruct.ap.shaded.freemarker.core.UnifiedCall.accept(UnifiedCall.java:84)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:335)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:377)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.invokeMacroOrFunctionCommonPart(Environment.java:877)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.invokeMacro(Environment.java:813)
	at org.mapstruct.ap.shaded.freemarker.core.UnifiedCall.accept(UnifiedCall.java:84)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:335)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:377)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visitAndTransform(Environment.java:502)
	at org.mapstruct.ap.shaded.freemarker.core.UnifiedCall.accept(UnifiedCall.java:104)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:335)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:341)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.process(Environment.java:314)
	at org.mapstruct.ap.shaded.freemarker.template.Template.process(Template.java:383)
	at org.mapstruct.ap.internal.writer.FreeMarkerModelElementWriter.write(FreeMarkerModelElementWriter.java:35)
	at org.mapstruct.ap.internal.writer.FreeMarkerWritable.write(FreeMarkerWritable.java:19)
	at org.mapstruct.ap.internal.writer.ModelIncludeDirective.execute(ModelIncludeDirective.java:48)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:452)
	at org.mapstruct.ap.shaded.freemarker.core.UnifiedCall.accept(UnifiedCall.java:102)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:335)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:341)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.process(Environment.java:314)
	at org.mapstruct.ap.shaded.freemarker.template.Template.process(Template.java:383)
	at org.mapstruct.ap.internal.writer.FreeMarkerModelElementWriter.write(FreeMarkerModelElementWriter.java:35)
	at org.mapstruct.ap.internal.writer.FreeMarkerWritable.write(FreeMarkerWritable.java:19)
	at org.mapstruct.ap.internal.writer.ModelIncludeDirective.execute(ModelIncludeDirective.java:48)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:452)
	at org.mapstruct.ap.shaded.freemarker.core.UnifiedCall.accept(UnifiedCall.java:102)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:335)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:341)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:377)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.invokeNestedContent(Environment.java:621)
	at org.mapstruct.ap.shaded.freemarker.core.BodyInstruction.accept(BodyInstruction.java:60)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:335)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:377)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.invokeMacroOrFunctionCommonPart(Environment.java:877)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.invokeMacro(Environment.java:813)
	at org.mapstruct.ap.shaded.freemarker.core.UnifiedCall.accept(UnifiedCall.java:84)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:335)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:341)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.process(Environment.java:314)
	at org.mapstruct.ap.shaded.freemarker.template.Template.process(Template.java:383)
	at org.mapstruct.ap.internal.writer.FreeMarkerModelElementWriter.write(FreeMarkerModelElementWriter.java:35)
	at org.mapstruct.ap.internal.writer.FreeMarkerWritable.write(FreeMarkerWritable.java:19)
	at org.mapstruct.ap.internal.writer.ModelIncludeDirective.execute(ModelIncludeDirective.java:48)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:452)
	at org.mapstruct.ap.shaded.freemarker.core.UnifiedCall.accept(UnifiedCall.java:102)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:335)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:341)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.process(Environment.java:314)
	at org.mapstruct.ap.shaded.freemarker.template.Template.process(Template.java:383)
	at org.mapstruct.ap.internal.writer.FreeMarkerModelElementWriter.write(FreeMarkerModelElementWriter.java:35)
	at org.mapstruct.ap.internal.writer.FreeMarkerWritable.write(FreeMarkerWritable.java:19)
	at org.mapstruct.ap.internal.writer.ModelIncludeDirective.execute(ModelIncludeDirective.java:48)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:452)
	at org.mapstruct.ap.shaded.freemarker.core.UnifiedCall.accept(UnifiedCall.java:102)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:371)
	at org.mapstruct.ap.shaded.freemarker.core.IteratorBlock$IterationContext.executedNestedContentForCollOrSeqListing(IteratorBlock.java:291)
	at org.mapstruct.ap.shaded.freemarker.core.IteratorBlock$IterationContext.executeNestedContent(IteratorBlock.java:271)
	at org.mapstruct.ap.shaded.freemarker.core.IteratorBlock$IterationContext.accept(IteratorBlock.java:244)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visitIteratorBlock(Environment.java:645)
	at org.mapstruct.ap.shaded.freemarker.core.IteratorBlock.acceptWithResult(IteratorBlock.java:108)
	at org.mapstruct.ap.shaded.freemarker.core.IteratorBlock.accept(IteratorBlock.java:94)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:335)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:341)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:341)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:341)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.process(Environment.java:314)
	at org.mapstruct.ap.shaded.freemarker.template.Template.process(Template.java:383)
	at org.mapstruct.ap.internal.writer.FreeMarkerModelElementWriter.write(FreeMarkerModelElementWriter.java:35)
	at org.mapstruct.ap.internal.writer.FreeMarkerWritable.write(FreeMarkerWritable.java:19)
	at org.mapstruct.ap.internal.writer.ModelIncludeDirective.execute(ModelIncludeDirective.java:48)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:452)
	at org.mapstruct.ap.shaded.freemarker.core.UnifiedCall.accept(UnifiedCall.java:102)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:371)
	at org.mapstruct.ap.shaded.freemarker.core.IteratorBlock$IterationContext.executedNestedContentForCollOrSeqListing(IteratorBlock.java:291)
	at org.mapstruct.ap.shaded.freemarker.core.IteratorBlock$IterationContext.executeNestedContent(IteratorBlock.java:271)
	at org.mapstruct.ap.shaded.freemarker.core.IteratorBlock$IterationContext.accept(IteratorBlock.java:244)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visitIteratorBlock(Environment.java:645)
	at org.mapstruct.ap.shaded.freemarker.core.IteratorBlock.acceptWithResult(IteratorBlock.java:108)
	at org.mapstruct.ap.shaded.freemarker.core.IteratorBlock.accept(IteratorBlock.java:94)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:335)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.visit(Environment.java:341)
	at org.mapstruct.ap.shaded.freemarker.core.Environment.process(Environment.java:314)
	at org.mapstruct.ap.shaded.freemarker.template.Template.process(Template.java:383)
	at org.mapstruct.ap.internal.writer.FreeMarkerModelElementWriter.write(FreeMarkerModelElementWriter.java:35)
	at org.mapstruct.ap.internal.writer.FreeMarkerWritable.write(FreeMarkerWritable.java:19)
	at org.mapstruct.ap.internal.writer.ModelWriter.writeModel(ModelWriter.java:69)
	at org.mapstruct.ap.internal.processor.MapperRenderingProcessor.createSourceFile(MapperRenderingProcessor.java:62)
	at org.mapstruct.ap.internal.processor.MapperRenderingProcessor.writeToSourceFile(MapperRenderingProcessor.java:39)
	at org.mapstruct.ap.internal.processor.MapperRenderingProcessor.process(MapperRenderingProcessor.java:29)
	at org.mapstruct.ap.internal.processor.MapperRenderingProcessor.process(MapperRenderingProcessor.java:24)
	at org.mapstruct.ap.MappingProcessor.process(MappingProcessor.java:400)
	at org.mapstruct.ap.MappingProcessor.processMapperTypeElement(MappingProcessor.java:380)
	at org.mapstruct.ap.MappingProcessor.processMapperElements(MappingProcessor.java:329)
	at org.mapstruct.ap.MappingProcessor.process(MappingProcessor.java:213)
	at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:1021)
	at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:937)
	at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1265)
	at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1380)
	at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1272)
	at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:946)
	at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.lambda$doCall$0(JavacTaskImpl.java:104)
	at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.invocationHelper(JavacTaskImpl.java:152)
	at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:100)
	at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:94)
	at org.codehaus.plexus.compiler.javac.JavaxToolsCompiler.compileInProcess(JavaxToolsCompiler.java:126)
	at org.codehaus.plexus.compiler.javac.JavacCompiler.performCompile(JavacCompiler.java:214)
	at org.apache.maven.plugin.compiler.AbstractCompilerMojo.execute(AbstractCompilerMojo.java:1228)
	at org.apache.maven.plugin.compiler.CompilerMojo.execute(CompilerMojo.java:215)
	at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:126)
	at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2(MojoExecutor.java:328)
	at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute(MojoExecutor.java:316)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:212)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:174)
	at org.apache.maven.lifecycle.internal.MojoExecutor.access$000(MojoExecutor.java:75)
	at org.apache.maven.lifecycle.internal.MojoExecutor$1.run(MojoExecutor.java:162)
	at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute(DefaultMojosExecutionStrategy.java:39)
	at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:159)
	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:105)
	at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:73)
	at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:53)
	at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:118)
	at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:261)
	at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:173)
	at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:101)
	at org.apache.maven.cli.MavenCli.execute(MavenCli.java:906)
	at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:283)
	at org.apache.maven.cli.MavenCli.main(MavenCli.java:206)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:255)
	at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:201)
	at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:361)
	at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:314)
	at org.codehaus.classworlds.Launcher.main(Launcher.java:41)

Steps to reproduce the problem

  • Create 2 classes (ClassA and ClassB), both each having a nested property of the same name (param) and structurally similar type (NestedClassA and NestedClassB, respectively).
  • Specify a mapper:
    ClassB normalMappingWorks(ClassA source);

    void updateMappingFails(ClassA source, @MappingTarget ClassB target);
  • and a condition:
    @Condition
    default boolean canMap(Object source, @TargetPropertyName String propertyName) {
        return true;
    }
  • Compilation fails, producing the above error.
  • If the update mapping is commented out, the generation works.

A MCVE is attached (tested with Java 21 Maven 3.9.9): mcve.zip

MapStruct Version

MapStruct 1.6.3

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions