Skip to content

StackOverflowError in DefaultBuilderProvider when a type has a public static generic method that returns type io.vavr.collection.List #1751

Description

@remipassmoilesel

Hi !
I am playing a little with vavr (http://www.vavr.io) and mapstruct, but if I try to map beans with vavr lists, it fails with a stackoverflow error, even if I provide an implementation.

Mapper:

@Mapper
public interface PersonMapper {

    @Mappings(
            @Mapping(source = "age", target = "ageOfPerson")
    )
    PersonEntity toEntity(PersonDto dto);

    java.util.List<PersonEntity> toEntities(java.util.List<PersonDto> dtos);

    // Cause a stackoverlow. Why ?
    // List<PersonEntity> toVavrEntityList(List<PersonDto> dtos);

    // The same !

    // default List<PersonEntity> toVavrEntityList(List<PersonDto> dtos){
    //     return List.ofAll(toEntities(dtos.asJava()));
    // }

    @Mappings(
            @Mapping(source = "ageOfPerson", target = "age")
    )
    PersonDto toDto(PersonEntity entity);

    java.util.List<PersonDto> toDtos(java.util.List<PersonEntity> entities);

    default java.util.List<PersonDto> toDtosWithFancyRules(java.util.List<PersonEntity> entities) {
        return toDtos(entities).stream()
                .map(person -> person.toBuilder().age(person.getAge() * 2).build())
                .collect(Collectors.toList());
    }

}

Error:

.../lightplayground/mapstruct/PersonMapper.java:11: error: Internal error in the mapping processor: java.la.StackOverflowError   
     at jdk.compiler/com.sun.tools.javac.util.Name.toString(Name.java:152)
     at jdk.compiler/com.sun.tools.javac.util.Name.charAt(Name.java:66) 
     at java.base/java.util.regex.Pattern$Slice.match(Pattern.java:4082)
     at java.base/java.util.regex.Pattern$Begin.match(Pattern.java:3656)
     at java.base/java.util.regex.Matcher.match(Matcher.java:1755)
     at java.base/java.util.regex.Matcher.matches(Matcher.java:713)     
     at org.mapstruct.ap.spi.DefaultBuilderProvider.shouldIgnore(DefaultBuilderProvider.java:281)
     at org.mapstruct.ap.spi.DefaultBuilderProvider.findBuildMethods(DefaultBuilderProvider.java:229)   
     at org.mapstruct.ap.spi.DefaultBuilderProvider.findBuilderInfo(DefaultBuilderProvider.java:167)    
     at org.mapstruct.ap.spi.DefaultBuilderProvider.findBuilderInfo(DefaultBuilderProvider.java:96)     
     at org.mapstruct.ap.internal.model.common.TypeFactory.findBuilder(TypeFactory.java:530)    
     at org.mapstruct.ap.internal.model.common.TypeFactory.getType(TypeFactory.java:189)
     at org.mapstruct.ap.internal.model.common.TypeFactory.getType(TypeFactory.java:180)
     at org.mapstruct.ap.internal.model.common.BuilderType.create(BuilderType.java:98)  
     at org.mapstruct.ap.internal.model.common.Type.<init>(Type.java:160)
     at org.mapstruct.ap.internal.model.common.TypeFactory.getType(TypeFactory.java:280)
     at org.mapstruct.ap.internal.model.common.TypeFactory.getType(TypeFactory.java:180)
     at org.mapstruct.ap.internal.model.common.BuilderType.create(BuilderType.java:98)  
     at org.mapstruct.ap.internal.model.common.Type.<init>(Type.java:160)
     at org.mapstruct.ap.internal.model.common.TypeFactory.getType(TypeFactory.java:280)
     at org.mapstruct.ap.internal.model.common.TypeFactory.getType(TypeFactory.java:180)
     at org.mapstruct.ap.internal.model.common.BuilderType.create(BuilderType.java:98)  
     at org.mapstruct.ap.internal.model.common.Type.<init>(Type.java:160)
     at org.mapstruct.ap.internal.model.common.TypeFactory.getType(TypeFactory.java:280)
     at org.mapstruct.ap.internal.model.common.TypeFactory.getType(TypeFactory.java:180)
     at org.mapstruct.ap.internal.model.common.BuilderType.create(BuilderType.java:98)  
     at org.mapstruct.ap.internal.model.common.Type.<init>(Type.java:160)
     at org.mapstruct.ap.internal.model.common.TypeFactory.getType(TypeFactory.java:280)
...

And beans are very simples. You can find a working example online:

Repo:
https://github.com/remipassmoilesel/mapstruct-issue-03-2019

Mapper:
https://github.com/remipassmoilesel/mapstruct-issue-03-2019/blob/master/src/main/java/org/remipassmoilesel/lightplayground/mapstruct/PersonMapper.java

Beans:
https://github.com/remipassmoilesel/mapstruct-issue-03-2019/tree/master/src/main/java/org/remipassmoilesel/lightplayground/mapstruct

Basic test:
https://github.com/remipassmoilesel/mapstruct-issue-03-2019/blob/master/src/test/java/org/remipassmoilesel/lightplayground/mapstruct/MapstructTest.java

Thanks for your help, and this awesome work on MapStruct !

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions