it-swarm.com.de

MapStruct und Lombok arbeiten nicht zusammen

Tech Stack wird verwendet: 

Java 8 MapStruct: 1.2.0.Final Lombok: 1.16.18 IDE: IntelliJ - Lombok Plugin ist bereits installiert 

  • Anfangs hatte ich Probleme, als ich Getter und Setter entfernt und @Getter und @Setter Annotation hinzugefügt habe. mapstruct kann die Eigenschaft nicht finden und sagt: Unknown property "id" in result type com.vg.once.dto.OneDto. Did you mean "null"?
  • Ich habe erfahren, dass Lombok 1.16.14 oder neuer zusammen mit MapStruct 1.2.0.Beta1 oder neuer kompatibel sind und zusammenarbeiten können, aber meine Versionen sind neuer, wenn das gewünschte Problem immer noch auftritt.
  • Eine weitere Lösung, die ich bereits ausprobiert habe, ist das Lombok-Delombok-Plugin, aber immer noch das gleiche Problem. 

Unten sind die Projektdateien:

Das Objekt Objekt: 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;

}

Das DTO-Objekt: 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;

}

Mapper-Klasse: 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>

Build 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

bitte teilen Sie uns mit, wie ich dies mit Lombok und MapStruct zusammenarbeiten kann.

14
Vivek Gupta

Der Grund dafür ist, dass Maven nur den MapStruct-Prozessor und nicht den Lombok-Prozessor verwendet. annotationProcessorPaths teilt maven mit, welche Prozessoren verwendet werden sollen.

Der Delombok tut nichts, da Sie mit 2 Dateien pro Klasse enden und ich denke, dass der Maven-Compiler sie nicht sieht.

Sie haben 2 Möglichkeiten:

Option 1: Fügen Sie die Lombok-Abhängigkeit in anootationProcessorPaths hinzu.

<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:

Fügen Sie den Abhängigkeiten mapstruct-processor zu Ihren Abhängigkeiten hinzu und entfernen Sie die annotationProcessorPaths. Auf diese Weise nimmt der Maven-Compiler alle Anmerkungsprozessoren auf, die sich in Ihren Abhängigkeiten befinden.

Ich würde bei der Verwendung von Option 1 raten, da Sie damit sicher sein können, dass Sie nicht einige transitive MapStruct-Abhängigkeiten und interne Klassen in Ihrem Code verwenden.

Bearbeiten:

Um sicherzustellen, dass die IntelliJ-Anmerkungsverarbeitung ebenfalls funktioniert, müssen Sie mapstruct-processor als provided-Abhängigkeit aufgrund von IDEA-150621 hinzufügen. IntelliJ verwendet momentan das annotationProcessorPaths von Maven nicht, um das Projekt richtig zu konfigurieren.

20
Filip

Für den Fall, dass jemand nach einer Konfiguration mit Gradle sucht:

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

Ich hatte ähnliche Probleme. Es stellte sich heraus, dass meine MapStruct-Version veraltet war!

Ich habe MapStruct Version 1.1.0.Final verwendet, aber für die Unterstützung von Lombok ist mindestens 1.2.0.Final erforderlich .

0
Laess3r