You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 06:25:38