web-dev-qa-db-fra.com

MapStruct et Lombok ne travaillent pas ensemble

Tech Stack utilisé: 

Java 8 MapStruct: 1.2.0.Final Lombok: 1.16.18 IDE: IntelliJ - Le plugin Lombok est déjà installé. 

  • Initialement, j'ai rencontré des problèmes lorsque j'ai supprimé les getters et les setters et que j'ai ajouté les annotations @Getter et @Setter, mapstruct n'est pas en mesure de trouver la propriété et dit: Unknown property "id" in result type com.vg.once.dto.OneDto. Did you mean "null"?
  • J'ai appris que Lombok 1.16.14 ou une version plus récente, ainsi que MapStruct 1.2.0.Beta1 ou une version plus récente, sont compatibles et peuvent fonctionner ensemble, mais mes versions sont plus récentes, mais le problème se pose.
  • Une autre solution que j'ai déjà essayée consiste à exécuter le plugin Delombok de Lombok, mais le même problème se pose. 

Voici les fichiers de projet:

L'objet entité: One.Java :

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class One {

    private int id;
    private Integer version;
    private int projectId;
    private String title;
    private String code;
    private int sortOrder;

}

L'objet DTO: OneDTO.Java :

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class OneDto {

    private int id;
    private Integer version;
    private int projectId;
    private String title;
    private String code;
    private int sortOrder;

}

Classe de mappeur: OneMapper.Java

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;

import com.vg.once.dto.OneDto;
import com.vg.once.entity.One;

@Mapper
public interface OneMapper {

    @Mapping(target="id", source="one.id")
    OneDto createOne (One one);

}

pom.xml

<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>
  <groupId>com.vg</groupId>
  <artifactId>mapstruct</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>Mapstruct-test</name>

    <properties>
        <Java.version>1.8</Java.version>
        <org.mapstruct.version>1.2.0.Final</org.mapstruct.version>
        <org.projectlombok.version>1.16.18</org.projectlombok.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${org.projectlombok.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-jdk8</artifactId>
            <version>${org.mapstruct.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins> 
         <plugin>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok-maven-plugin</artifactId>
                <version>1.16.18.1</version>
                <executions>
                    <execution>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>delombok</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <sourceDirectory>src/main/Java</sourceDirectory>
                    <addOutputDirectory>false</addOutputDirectory>
                    <outputDirectory>${project.build.directory}/delombok</outputDirectory>
                    <encoding>UTF-8</encoding>
                    <skip>false</skip>
                    <verbose>false</verbose>
                </configuration>
            </plugin>       
            <plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.6.1</version>
                <configuration>
                    <source>${Java.version}</source>
                    <target>${Java.version}</target>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>${org.mapstruct.version}</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
        </plugins>
    </build>  
</project>

Créer une trace

[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building Mapstruct-test 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- lombok-maven-plugin:1.16.18.1:delombok (default) @ mapstruct ---
[INFO] Delombok complete.
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ mapstruct ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO] 
[INFO] --- maven-compiler-plugin:3.6.1:compile (default-compile) @ mapstruct ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 5 source files to /home/vivekgupta/Documents/workspaces/mapstruct-test/mapstruct/target/classes
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] /home/vivekgupta/Documents/workspaces/mapstruct-test/mapstruct/src/main/Java/com/vg/once/mapper/OneMapper.Java:[12,9] Unknown property "id" in result type com.vg.once.dto.OneDto. Did you mean "null"?
[INFO] 1 error
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.637 s
[INFO] Finished at: 2017-12-06T19:23:53+05:30
[INFO] Final Memory: 19M/235M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.Apache.maven.plugins:maven-compiler-plugin:3.6.1:compile (default-compile) on project mapstruct: Compilation failure
[ERROR] /home/vivekgupta/Documents/workspaces/mapstruct-test/mapstruct/src/main/Java/com/vg/once/mapper/OneMapper.Java:[12,9] Unknown property "id" in result type com.vg.once.dto.OneDto. Did you mean "null"?
[ERROR] -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.Apache.org/confluence/display/MAVEN/MojoFailureException

s'il vous plaît partager comment puis-je obtenir ce travail en utilisant à la fois Lombok et MapStruct ensemble?

14
Vivek Gupta

La raison pour laquelle cela ne fonctionne pas est que Maven utilise uniquement le processeur MapStruct et non le processeur Lombok. annotationProcessorPaths indique à maven quels processeurs il doit utiliser.

Le delombok ne fait rien car vous vous retrouvez avec 2 fichiers par classe et je pense que le compilateur Maven ne les voit pas.

Vous avez 2 options:

Option 1: Ajouter la dépendance de lombok dans la anootationProcessorPaths

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.6.1</version>
    <configuration>
        <source>${Java.version}</source>
        <target>${Java.version}</target>
        <annotationProcessorPaths>
            <path>
                <groupId>org.mapstruct</groupId>
                <artifactId>mapstruct-processor</artifactId>
                <version>${org.mapstruct.version}</version>
            </path>
            <path>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${org.projectlombok.version}</version>
            </path>
        </annotationProcessorPaths>
    </configuration>
</plugin>

Option 2:

Ajoutez la dépendance mapstruct-processor à vos dépendances et supprimez la annotationProcessorPaths. De cette façon, le compilateur maven récupérera tous les processeurs d'annotation qui se trouvent dans vos dépendances.

Je conseillerais d'utiliser l'option 1, car vous pouvez être certain de ne pas utiliser des dépendances transitives MapStruct et des classes internes dans votre code.

Modifier:

Pour vous assurer que le traitement des annotations IntelliJ fonctionne également, vous devez ajouter le mapstruct-processor en tant que dépendance provided en raison de IDEA-150621 . Dans l’instant, IntelliJ n’utilise pas la variable annotationProcessorPaths de Maven pour configurer le projet correctement.

20
Filip

Juste au cas où quelqu'un cherche comment le configurer avec Gradle:

dependencies {

   // Lombok
   compileOnly 'org.projectlombok:lombok:1.18.2'
   annotationProcessor 'org.projectlombok:lombok:1.18.2'

   // MapStruct
   compileOnly 'org.mapstruct:mapstruct-jdk8:1.2.0.Final'
   annotationProcessor 'org.mapstruct:mapstruct-processor:1.2.0.Final'

}
6
Alexander

J'ai eu des problèmes similaires. Il s'est avéré que ma version de MapStruct était obsolète!

J'ai utilisé MapStruct version 1.1.0.Final, mais pour le support Lombok au moins 1.2.0.Final est requis .

0
Laess3r