I am a newbie to Spring Boot and MapStruct Tool.
Earlier, A Project(written by other team using these technologies) is not starting up. Then, I had made some changes i
Making abstract class as an interface worked for me.
public interface UserAndEmployeeMapper {
First of all, public UserAndEmployeeMapper INSTANCE = Mappers.getMapper( UserAndEmployeeMapper.class );
should only be used with the default component model, otherwise you risk to have the UserAndEmployeeMapper
not correctly initialized.
The UserAndEmployeeMapper
in your LoginServiceImpl
must be annotated with @Autowired
, otherwise it cannot be injected by Spring, and that's why it is null
.
I don't know your package structure. If your Spring Boot application class in the package org
then it will pick up the UserAndEmployeeMapperImpl
. Otherwise make sure that the spring configuration picks up the UserAndEmployeeMapperImpl
.
If everything from above is correctly setup and you are starting the application via an IDE make sure that target/generated-sources
or the alternative for Gradle is part of your sources and is picked up. Have a look at the IDE Support to make sure that you have correctly setup the Annotation processor discovery for an IDE. For example, IntelliJ will not invoke the MapStruct Annotation Processor with your current setup, it doesn't pick up the annotationProcessorPaths
from the maven compiler.
springfox-swagger2 dependency is loading older version of mapstruct after excluding it and adding specific version of mapstruct dependency in pom.xml it started generating sources
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.2.2</version>
<exclusions>
<exclusion>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
</exclusion>
</exclusions>
Added below map struct dependency
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>1.3.0.Beta1</version>
In my case, I believe the error was due to an incomplete build.gradle.
Before
dependencies {
compile group: 'org.mapstruct', name: 'mapstruct-processor', version: '1.2.0.Final'
}
After
apply plugin: 'net.ltgt.apt'
dependencies {
compile group: 'org.mapstruct', name: 'mapstruct-processor', version: '1.2.0.Final'
compile group: 'org.mapstruct', name: 'mapstruct-jdk8', version: '1.2.0.Final'
apt 'org.mapstruct:mapstruct-processor:1.2.0.Final'
}
buildscript {
repositories {
mavenCentral()
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath("net.ltgt.gradle:gradle-apt-plugin:0.9")
}
}
Ensure you have configured your build.gradle properly, as described in the docs.
For making all mapper classes to qualify as spring bean add following compilerArgs to your maven-compiler-plugin.
<compilerArgs>
<arg>-Amapstruct.suppressGeneratorTimestamp=true</arg>
<arg>-Amapstruct.defaultComponentModel=spring</arg>
</compilerArgs>
if using maven-processor-plugin add following options
<options>
<mapstruct.suppressGeneratorTimestamp>
true
</mapstruct.suppressGeneratorTimestamp>
<mapstruct.defaultComponentModel>
spring
</mapstruct.defaultComponentModel>
</options>