Mapstruct与包可见性Lombok Builder协同使用问题咨询
MapStruct 搭配包可见性 Lombok Builder 的问题
我在使用MapStruct搭配仅包可见性的Lombok Builder时遇到问题:目标对象Dataset与Mapper处于同一包下,Builder对Mapper可见,但MapStruct生成的代码却选择使用构造器。若将Builder可见性改为public,就能被Mapper正常识别。请问是否可以实现包可见性下也能让MapStruct使用Builder?
代码示例
CreateDatasetDto(dto包)
package dto; @Value public class CreateDatasetDto { private String name; }
Dataset(dataset包)
package dataset; @Builder(access = AccessLevel.PACKAGE) @Data @Document public class Dataset { @Id private String id; private String name; @Builder.Default private Instant dateCreated = Instant.now(); }
DatasetMapper(dataset包)
package dataset; @Mapper public interface DatasetMapper { Dataset mapCreateDatasetDtoToDomainObject(CreateDatasetDto createDatasetDto); }
解决方案
可以通过以下方式实现包可见性下MapStruct使用Lombok Builder:
添加编译参数开启包可见Builder支持
MapStruct 1.4.0及以上版本提供了专门的编译参数,允许识别包可见的Builder。只需在构建配置中添加参数-Amapstruct.allowPackagePrivateBuilders=true:Maven配置示例:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>11</source> <target>11</target> <annotationProcessorPaths> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.5.5.Final</version> </path> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.28</version> </path> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok-mapstruct-binding</artifactId> <version>0.2.0</version> </path> </annotationProcessorPaths> <compilerArgs> <arg>-Amapstruct.allowPackagePrivateBuilders=true</arg> </compilerArgs> </configuration> </plugin>Gradle配置示例:
dependencies { annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final' annotationProcessor 'org.projectlombok:lombok:1.18.28' annotationProcessor 'org.projectlombok:lombok-mapstruct-binding:0.2.0' } compileJava { options.compilerArgs += [ '-Amapstruct.allowPackagePrivateBuilders=true' ] }显式指定使用Builder
在Mapper接口或方法上添加@BeanMapping注解,明确告知MapStruct使用Builder:
package dataset; @Mapper @BeanMapping(builder = @Builder) public interface DatasetMapper { Dataset mapCreateDatasetDtoToDomainObject(CreateDatasetDto createDatasetDto); }
内容的提问来源于stack exchange,提问作者miro
相关产品推荐
相关产品推荐

