Reputation: 3
I recently discovered Mapstruct and something quite weird is happening. Almost every single time, new implementation of mapper is generating and sometimes is with/without getters and setters. After some research I still can't find a issue with that.
As all of the dependencies, as well as proper annotation paths are in pom.xml
<dependencies>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.2.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.2.Final</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka-test</artifactId>
<version>2.9.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
<version>4.15.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>0.2.0</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.4.1.Final</version>
</path>
</annotationProcessorPaths>
<compilerArgs>
<compilerArg>
-Amapstruct.defaultComponentModel=spring
</compilerArg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
@Mapper(componentModel = "spring")
public interface MessageMapper {
MessageEntity messageDtoToEntity(MessageDTO messageDTO);
MessageDTO messageEntityToDto(MessageEntity messageEntity);
}
@Getter
@Setter
@Entity
@Table(name = "messages")
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class MessageEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Setter(AccessLevel.NONE)
private Long id;
@Column(name = "message", nullable = false)
private String message;
public static MessageEntity createMessageEntityWithName(String message) {
MessageEntity mes = new MessageEntity();
mes.setMessage(message);
return mes;
}
}
@NoArgsConstructor
@Getter
@Setter
public class MessageDTO {
@NotNull(message = "Field message has to be provided")
private String message;
public static MessageDTO create(String message) {
MessageDTO mes = new MessageDTO();
mes.setMessage(message);
return mes;
}
}
@Component
public class MessageMapperImpl implements MessageMapper {
@Override
public MessageEntity messageDtoToEntity(MessageDTO messageDTO) {
if ( messageDTO == null ) {
return null;
}
MessageEntity messageEntity = new MessageEntity();
return messageEntity;
}
@Override
public MessageDTO messageEntityToDto(MessageEntity messageEntity) {
if ( messageEntity == null ) {
return null;
}
MessageDTO messageDTO = new MessageDTO();
return messageDTO;
}
}
Upvotes: 0
Views: 129
Reputation: 21423
The reason why this is not working is because the annotationProcessorPaths
is configured on the spring-boot-maven-plugin
. The annotationProcessorPaths
needs to be configured on the maven-compiler-plugin
and then the annotation processors will properly be used (including the lombok-mapstruct-binding
.
Upvotes: 1