如何指示Mapstruct使用lombok builder?
How to instruct Mapstruct to use lombok builder?
当我尝试使用私有默认构造函数映射对象但使用(lombok 生成的)构建器时,MapStruct 无法创建实现。
SomeMapperImpl.java:[20,27] SomeDto() is not public in
com.example.mapstructdemo.dto.SomeDto; cannot be accessed from outside
package
Dto:
@Value
@Builder
public class SomeDto {
}
型号:
@Value
@Builder
public class SomeModel {
}
映射器接口:
@Mapper
public interface SomeMapper {
SomeDto map(SomeModel someModel);
SomeModel map(SomeDto someDto);
}
来自 Pom.xml 的片段:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${compiler-plugin.version}</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</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>
</configuration>
</plugin>
生成的实现:
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2021-01-29T13:47:46+0100",
comments = "version: 1.4.1.Final, compiler: javac, environment: Java 11.0.9.1 (Ubuntu)"
)
public class SomeMapperImpl implements SomeMapper {
@Override
public SomeDto map(SomeModel someModel) {
if ( someModel == null ) {
return null;
}
SomeDto someDto = new SomeDto();
return someDto;
}
@Override
public SomeModel map(SomeDto someDto) {
if ( someDto == null ) {
return null;
}
SomeModel someModel = new SomeModel();
return someModel;
}
}
我可以做些什么来帮助 mapstruct 找到构建器?
要重现该问题,请克隆此存储库 https://github.com/rmvanderspek/mapstruct-demo 并进行 mvn 验证。
我试过你的演示源,结果证明将 Mapstruct 放在编译器插件源中的第一个位置可以解决这个问题。我不知道为什么会这样,这对我来说是违反直觉的,但这是 Mapstruct 的一位开发人员在 a similar issue posted on Lombok's Github.
中建议的
所以在你的情况下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${compiler-plugin.version}</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.mapstruct-processor.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${org.projectlombok.lombok.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>${org.projectlombok.ombok-mapstruct-binding.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
我将 lombok 工件放在依赖项中的 mapstruct 和 mapstruct-processor 工件下面,它开始工作了。
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>${lombok-mapstruct-binding.version}</version>
</dependency>
</dependencies>
当我尝试使用私有默认构造函数映射对象但使用(lombok 生成的)构建器时,MapStruct 无法创建实现。
SomeMapperImpl.java:[20,27] SomeDto() is not public in com.example.mapstructdemo.dto.SomeDto; cannot be accessed from outside package
Dto:
@Value
@Builder
public class SomeDto {
}
型号:
@Value
@Builder
public class SomeModel {
}
映射器接口:
@Mapper
public interface SomeMapper {
SomeDto map(SomeModel someModel);
SomeModel map(SomeDto someDto);
}
来自 Pom.xml 的片段:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${compiler-plugin.version}</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</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>
</configuration>
</plugin>
生成的实现:
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2021-01-29T13:47:46+0100",
comments = "version: 1.4.1.Final, compiler: javac, environment: Java 11.0.9.1 (Ubuntu)"
)
public class SomeMapperImpl implements SomeMapper {
@Override
public SomeDto map(SomeModel someModel) {
if ( someModel == null ) {
return null;
}
SomeDto someDto = new SomeDto();
return someDto;
}
@Override
public SomeModel map(SomeDto someDto) {
if ( someDto == null ) {
return null;
}
SomeModel someModel = new SomeModel();
return someModel;
}
}
我可以做些什么来帮助 mapstruct 找到构建器?
要重现该问题,请克隆此存储库 https://github.com/rmvanderspek/mapstruct-demo 并进行 mvn 验证。
我试过你的演示源,结果证明将 Mapstruct 放在编译器插件源中的第一个位置可以解决这个问题。我不知道为什么会这样,这对我来说是违反直觉的,但这是 Mapstruct 的一位开发人员在 a similar issue posted on Lombok's Github.
中建议的所以在你的情况下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${compiler-plugin.version}</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.mapstruct-processor.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${org.projectlombok.lombok.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>${org.projectlombok.ombok-mapstruct-binding.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
我将 lombok 工件放在依赖项中的 mapstruct 和 mapstruct-processor 工件下面,它开始工作了。
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>${lombok-mapstruct-binding.version}</version>
</dependency>
</dependencies>