java - 如何指示 Mapstruct 使用 lombok builder?
问题描述
当我尝试使用私有默认构造函数但使用(lombok 生成的)构建器映射对象时,MapStruct 无法创建实现。
SomeMapperImpl.java:[20,27] SomeDto() 在 com.example.mapstructdemo.dto.SomeDto 中不公开;无法从外部包访问
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 找到构建器?
要重现该问题,请克隆此 repo https://github.com/rmvanderspek/mapstruct-demo和 mvn verify。
解决方案
我已经玩过您的演示源,结果证明将 Mapstruct 首先放在编译器插件源中可以解决问题。我不知道为什么会这样,这对我来说感觉违反直觉,但这是 Mapstruct 的开发人员之一在 Lombok 的 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>
推荐阅读
- r - 删除列中具有重复测量的变量中至少一个 NA 值的所有个体
- typing - 在 mypy 中使用函数签名作为可调用参数的类型
- python-3.x - Dask 是否通过使用 parquet 分区来执行 groupby 任务?
- javascript - Ajax Javascript 不会在不刷新页面的情况下更改我的 CSS
- bash - 如何使用 rsync 传输与模式匹配的文件
- r - 边界(单数)适合 lmer
- swift - 如何在 swift 中添加/更新 dict 中的键/值?
- okta-api - OKTA 无效范围问题
- c# - 如何在asp.net中管理列表索引
- flutter-web - Flutter Web - 将资产图像作为 File()