Skip to content

NoSuchElementException with InheritInverseConfiguration and nested properties with 1.6.0 #3670

@jjlharrison

Description

@jjlharrison

Expected behavior

No error as with 1.5.5.Final.

Actual behavior

src/main/java/example/mapstruct/ExampleMapper.java:9:17
java: Internal error in the mapping processor: java.util.NoSuchElementException
    at java.base/java.util.ArrayList$Itr.next(ArrayList.java:1053)
    at org.mapstruct.ap.internal.util.Collections.first(Collections.java:51)
    at org.mapstruct.ap.internal.model.NestedTargetPropertyMappingHolder$Builder.groupByTargetReferences(NestedTargetPropertyMappingHolder.java:365)
    at org.mapstruct.ap.internal.model.NestedTargetPropertyMappingHolder$Builder.build(NestedTargetPropertyMappingHolder.java:143)
    at org.mapstruct.ap.internal.model.BeanMappingMethod$Builder.handleDefinedNestedTargetMapping(BeanMappingMethod.java:1175)
    at org.mapstruct.ap.internal.model.BeanMappingMethod$Builder.handleDefinedMappings(BeanMappingMethod.java:1125)
    at org.mapstruct.ap.internal.model.BeanMappingMethod$Builder.build(BeanMappingMethod.java:292)
    at org.mapstruct.ap.internal.processor.MapperCreationProcessor.getMappingMethods(MapperCreationProcessor.java:427)
    at org.mapstruct.ap.internal.processor.MapperCreationProcessor.getMapper(MapperCreationProcessor.java:188)
    at org.mapstruct.ap.internal.processor.MapperCreationProcessor.process(MapperCreationProcessor.java:142)
    at org.mapstruct.ap.internal.processor.MapperCreationProcessor.process(MapperCreationProcessor.java:85)
    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 org.jetbrains.jps.javac.APIWrappers$ProcessorWrapper.process(APIWrappers.java:209)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
    at java.base/java.lang.reflect.Method.invoke(Method.java:580)
    at org.jetbrains.jps.javac.APIWrappers$1.invoke(APIWrappers.java:366)
    at org.mapstruct.ap.MappingProcessor.process(Unknown Source)
    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:1279)
    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.jetbrains.jps.javac.JavacMain.compile(JavacMain.java:238)
    at org.jetbrains.jps.incremental.java.JavaBuilder.lambda$compileJava$2(JavaBuilder.java:516)
    at org.jetbrains.jps.incremental.java.JavaBuilder.invokeJavac(JavaBuilder.java:578)
    at org.jetbrains.jps.incremental.java.JavaBuilder.compileJava(JavaBuilder.java:514)
    at org.jetbrains.jps.incremental.java.JavaBuilder.compile(JavaBuilder.java:358)
    at org.jetbrains.jps.incremental.java.JavaBuilder.doBuild(JavaBuilder.java:283)
    at org.jetbrains.jps.incremental.java.JavaBuilder.build(JavaBuilder.java:237)
    at org.jetbrains.jps.incremental.IncProjectBuilder.runModuleLevelBuilders(IncProjectBuilder.java:1609)
    at org.jetbrains.jps.incremental.IncProjectBuilder.runBuildersForChunk(IncProjectBuilder.java:1238)
    at org.jetbrains.jps.incremental.IncProjectBuilder.buildTargetsChunk(IncProjectBuilder.java:1389)
    at org.jetbrains.jps.incremental.IncProjectBuilder.buildChunkIfAffected(IncProjectBuilder.java:1203)
    at org.jetbrains.jps.incremental.IncProjectBuilder.buildChunks(IncProjectBuilder.java:971)
    at org.jetbrains.jps.incremental.IncProjectBuilder.runBuild(IncProjectBuilder.java:527)
    at org.jetbrains.jps.incremental.IncProjectBuilder.build(IncProjectBuilder.java:236)
    at org.jetbrains.jps.cmdline.BuildRunner.runBuild(BuildRunner.java:135)
    at org.jetbrains.jps.cmdline.BuildSession.runBuild(BuildSession.java:387)
    at org.jetbrains.jps.cmdline.BuildSession.run(BuildSession.java:212)
    at org.jetbrains.jps.cmdline.BuildMain$MyMessageHandler.lambda$channelRead0$0(BuildMain.java:211)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
    at java.base/java.lang.Thread.run(Thread.java:1570)  

Steps to reproduce the problem

@Mapper
public abstract class ExampleMapper {
    @Mapping(target = "name", source = ".", qualifiedByName = "getFromFlatObject")
    public abstract ObjectWithFlatProperties map(ObjectWithNestedProperties objectA);

    @InheritInverseConfiguration
    @Mapping(target = "nestedObject.nestedName", source = "name")
    public abstract ObjectWithNestedProperties map(ObjectWithFlatProperties objectB);

    @Named("getFromFlatObject")
    protected String mapFromFlatObject(final ObjectWithNestedProperties object) {
        // Some logic here
        return object.getNestedObject().getNestedName();
    }
}
@Value
public class NestedObject {
    String nestedName;
}
@Value
public class ObjectWithFlatProperties {
    String name;
}
@Value
public class ObjectWithNestedProperties {
    NestedObject nestedObject;
}

MapStruct Version

1.6.0

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions