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

Lombok @Builder(access=PRIVATE)引发编译错误,builder()方法未定义

问题分析与解决

错误原因

  1. Lombok注解处理器执行失败:大概率是Lombok版本和IDE/编译器不兼容、IDE没装Lombok插件,或者项目没正确配置注解处理器导致的。
  2. builder()方法未定义:你手动写了私有构造方法,可能导致Lombok无法正确生成私有静态的builder()方法;也可能是IDE没同步Lombok生成的代码,才报了编译错。

解决方案

第一步:修复Lombok注解处理器问题

  • IDE配置检查:
    • Eclipse:先装Lombok插件,再去Preferences > Java > Compiler > Annotation Processing里启用注解处理器,确保Lombok在处理器路径中。
    • IntelliJ IDEA:安装Lombok插件后,在Settings > Build, Execution, Deployment > Compiler > Annotation Processors里勾选Enable annotation processing。
  • 项目依赖配置:
    用Maven的话,把下面的配置加到pom.xml里,确保Lombok依赖和注解处理器都配置正确:
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.30</version>
        <scope>provided</scope>
    </dependency>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.11.0</version>
                <configuration>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>1.18.30</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
        </plugins>
    </build>
    
  • 更新Lombok版本:换成最新的稳定版,避开版本兼容坑。

第二步:修复builder()方法未定义问题(保持builder私有)

要让Lombok正确生成私有静态builder()方法,同时保留你的校验逻辑,有两种可行方案:

方案1:移除手动构造方法,让Lombok生成并整合校验

package net.gencat.transversal.espaidoc.domain.model.reference;

import lombok.AccessLevel;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.ToString;

@Getter
@Builder(access = AccessLevel.PRIVATE)
@EqualsAndHashCode
@ToString
public class NestedReference {
    private final ReferenceId referenceId;

    public static NestedReference of(ReferenceId referenceId) {
        return NestedReference.builder()
                .referenceId(referenceId)
                .build();
    }

    private static void validate(ReferenceId referenceId) {
        if (referenceId == null) {
            throw new IllegalArgumentException("ReferenceId cannot be null or empty");
        }
    }

    // 自定义build方法,Lombok会自动把它整合到生成的Builder里
    private NestedReference build() {
        validate(referenceId);
        return this;
    }
}

这样既保留了校验逻辑,又能让Lombok正常生成私有builder。

方案2:保留手动构造方法,显式指定@Builder使用该构造方法

如果必须保留手动构造方法,就显式指定builderMethodName,确保Lombok生成你需要的私有静态方法:

package net.gencat.transversal.espaidoc.domain.model.reference;

import lombok.AccessLevel;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.ToString;

@Getter
@Builder(access = AccessLevel.PRIVATE, builderMethodName = "builder")
@EqualsAndHashCode
@ToString
public class NestedReference {
    private final ReferenceId referenceId;

    private NestedReference(ReferenceId referenceId) {
        validate(referenceId);
        this.referenceId = referenceId;
    }

    public static NestedReference of(ReferenceId referenceId) {
        return builder() // 类内部静态方法可以直接调用私有静态builder方法
                .referenceId(referenceId)
                .build();
    }

    private static void validate(ReferenceId referenceId) {
        if (referenceId == null) {
            throw new IllegalArgumentException("ReferenceId cannot be null or empty");
        }
    }
}

验证步骤

  1. 清理并重新构建项目(Maven执行mvn clean compile)
  2. 重启IDE,让Lombok重新生成代码
  3. 检查编译错误是否消失

内容的提问来源于stack exchange,提问作者Jordi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 19:33:18