Java MapStruct和Lombok不在一起工作
正在使用的技术堆栈: 爪哇8 MapStruct:1.2.0.Final 龙目岛:1.16.18 IDE:IntelliJ-Lombok插件已安装Java MapStruct和Lombok不在一起工作,java,maven,lombok,mapstruct,intellij-lombok-plugin,Java,Maven,Lombok,Mapstruct,Intellij Lombok Plugin,正在使用的技术堆栈: 爪哇8 MapStruct:1.2.0.Final 龙目岛:1.16.18 IDE:IntelliJ-Lombok插件已安装 最初,当我删除Getter和Setter并添加@Getter和@Setter注释时,我遇到了问题,mapstruct无法找到属性,并在结果类型com.vg.once.dto.OneDto中说:未知属性“id”。你是说“空”吗? 我知道Lombok 1.16.14或更高版本与MapStruct 1.2.0.Beta1或更高版本是兼容的,可以一起工作,
- 最初,当我删除Getter和Setter并添加
和@Getter
注释时,我遇到了问题,@Setter
无法找到属性,并在结果类型com.vg.once.dto.OneDto中说:mapstruct
未知属性“id”。你是说“空”吗?
- 我知道Lombok 1.16.14或更高版本与MapStruct 1.2.0.Beta1或更高版本是兼容的,可以一起工作,但我的版本比预期版本更新,但问题仍然存在
- 我已经尝试过的另一个解决方案是运行Lombok的Delombok插件,但是仍然出现了同样的问题李>
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;
}
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;
}
映射器类: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>
请分享如何同时使用Lombok和MapStruct使其工作?之所以不工作,是因为Maven只使用MapStruct处理器,而不是Lombok处理器。
注释ProcessorPath
告诉maven应该使用哪些处理器
delombok什么也不做,因为每个类有2个文件,我认为maven编译器没有看到它们
您有两种选择:
选项1:在annotationProcessorPaths
<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.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${org.projectlombok.version}</version>
</path>
<!-- This is needed when using Lombok 1.18.16 and above -->
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>0.2.0</version>
</path>
<!-- Mapstruct should follow the lombok path(s) -->
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
org.apache.maven.plugins
. IntelliJ目前没有使用Maven提供的注释处理器路径
来正确配置项目
编辑2:
添加lombok 1.18.16中所需的有关lombok mapstruct binding的信息和注释。以防有人正在寻找如何使用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'
}
我也有类似的问题。原来我的MapStruct版本已经过时了
我使用了MapStruct版本1.1.0.Final,但是对于Lombok支持,至少需要1.2.0.Final。如果有人仍然在寻找这个答案,我在JOOQ+MapStruct集成中也遇到了类似的问题。答案是事情的顺序
- IntellijIdea 2020.2.3
- 爪哇8
- Spring框架2.4.0
我的构建代码段
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven.compiler.plugin.version}</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${org.lombok.version}</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
<!-- This is needed when using Lombok 1.8.16 and above -->
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>${org.lombok-mapstruct-binding.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.boot.version}</version>
</plugin>
</plugins>
</build>
org.apache.maven.plugins
maven编译器插件
${maven.compiler.plugin.version}
${java.version}
${java.version}
org.projectlombok
龙目
${org.lombok.version}
org.mapstruct
mapstruct处理器
${mapstruct.version}
org.projectlombok
lombok映射结构绑定
${org.lombok mapstruct binding.version}
org.springframework.boot
springbootmaven插件
${spring.boot.version}
对于我来说,解决方案非常简单
处理器的顺序很重要
在我的例子中,mapstruct处理器是在lombok处理器之前定义的。在顺序不正确的情况下,mapstruct不会生成映射,只需创建结果类的实例(我在生成的实现中看到了这一点)
我的插件配置顺序正确:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven.compiler.plugin.version}</version>
<configuration>
<source>15</source>
<target>15</target>
<compilerArgs>--enable-preview</compilerArgs>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
org.apache.maven.plugins
maven编译器插件
${maven.compiler.plugin.version}
15
15
--启用预览
org.projectlombok
龙目
${lombok.version}
org.mapstruct
mapstruct处理器
${mapstruct.version}
当然,您需要添加依赖项:
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
</dependency>
</dependencies>
org.projectlombok
龙目
假如
org.mapstruct
映射结构
${mapstruct.version}
我同意订单确实发挥了作用,在使用gradle时也是如此。在我的例子中,当我在多模块设置中将子项目{…dependencyManagement{}}
添加到父build.gradle
时,它就失败了。mapstruct只是返回了一个空实例。最近,我将Intellij版本升级到2020.3和spring boot 2.4.0,并陷入了这种情况
当我将spring版本更改为2.3.o.RELEASE时,我可以在编译后看到mapstruct正确地构建了映射
查看mapstruct最近更新的帖子。。但这需要时间……)所以,现在,我从maven搬到Gradle项目,一切都很好。。听起来很奇怪但却是真的
如果有人能发布正确的问题和解决方案,我将不胜感激。对于Intellij升级到2020.3版后出现的问题,以下解决方案对我有效。
使用lombok版本:1.18.16,lombok mapstruct绑定:0.2.0
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>0.2.0</version>
</dependency>
org.projectlombok
龙目
1.18.16
假如
org.projectlombok
lombok映射结构绑定
0.2.0
在插件的注释处理部分更改lombok和mapstruct插件路径的顺序:
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>11</source>
<target>11</target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${org.projectlombok.version}</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
org.springframework.boot
springbootmaven插件
org.apache.maven.plugins
maven编译器插件
3.5.1
11
11
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>11</source>
<target>11</target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${org.projectlombok.version}</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.target>11</maven.compiler.target>
<maven.compiler.source>11</maven.compiler.source>
<version.lombok>1.18.18</version.lombok>
<version.mapstruct>1.4.2.Final</version.mapstruct>
<version.mapstruct-lombok>0.2.0</version.mapstruct-lombok>
</properties>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${version.lombok}</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${version.mapstruct}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>${version.mapstruct-lombok}</version>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>9</source>
<target>9</target>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${version.mapstruct}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${version.lombok}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>${version.mapstruct-lombok}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>