8

I'm trying to create very simple JUnit test into Spring Cloud project:

@SpringBootTest(classes = {ProductMapper.class })
public class TestingWebApplicationTests {

    @Test
    public void contextLoads() {
    }

}

import org.mapstruct.Mapper;

@Mapper(config = BaseMapperConfig.class)
public interface ProductMapper {

    ProductDTO toDTO(Product product);

    ProductFullDTO toFullDTO(Product product);

    Product map(ProductFullDTO productDTO);

    ProductFilter toFilter(ProductFilterDTO dto);
}

I get this error when I try to run the test into the latest Intelij.

java: No implementation was created for ProductMapper due to having a problem in the erroneous element java.util.ArrayList. Hint: this often means that some other annotation processor was supposed to process the erroneous element. You can also enable MapStruct verbose mode by setting -Amapstruct.verbose=true as a compilation argument.

Do you know how I can fix this issue?

Peter Penzov
  • 1,126
  • 134
  • 430
  • 808

3 Answers3

17

Try to reorder your annotation processor factory path, move lombok to the top.

thinwa
  • 295
  • 3
  • 9
1

Use the generated implementation of the mapper within the Spring test configuration:

@SpringBootTest(classes = {ProductMapperImpl.class })

Also remember that the mapper itself should be bound to the Spring context.

Nikolas Charalambidis
  • 40,893
  • 16
  • 117
  • 183
0

It's not exactly related to MapStruct itself, but maybe it will save some devs a few minutes / hours when searching for the problem.

I had a similar problem in a project, where I was supposed to add new API version and mark old one as deprecated.

When I tried compiling with maven, I got errors

[ERROR] /src/main/java/com/example/MapStructMapperClass.java: No implementation was created for MapStructMapperClass.java due to having a problem in the erroneous element java.util.ArrayList. Hint: this often means that some other annotation processor was supposed to process the erroneous element. You can also enable MapStruct verbose mode by setting -Amapstruct.verbose=true as a compilation argument.

The project uses Lombok, so I checked annotation processor configs. Looked fine and worked properly on a simple, ad hoc created project. Tried bumping MapStruct and Lpmbok versions. Still the same problem.

Then, I noticed a few lines in the log:

[WARNING] COMPILATION WARNING :
[INFO] ------------------------------
[WARNING] /src/main/java/com/example/MyRestController.java: com.example.MyOldService in MyRestController has been deprecated
[INFO] 1 warning
[INFO] ----------------------
[ERROR] COMPILATION ERROR :
[INFO] ----------------------
[ERROR] warnings found and -Werror specified

And the config in maven pom.xml

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <failOnWarning>true</failOnWarning>
  <configuration>
</plugin>

As Javac JDK 8 states:

-Werror
    Terminate compilation if warnings occur.

So, my problem was that I used @Deprecated annotation and someone turned treating compilation warnings as errors on. Due to the project using MapStruct and having pleeeeenty of mappers with the same compilation error, I focused on solving the problem with the annotations processors, completely ignoring those "insignificant" warnings.

AndrewMcCoist
  • 609
  • 4
  • 12