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

为Lombok生成的内部Builder类添加默认公有无参构造方法

让Lombok生成的Builder类拥有默认构造方法的解决方案

遇到这个问题挺常见的——当你用Lombok的@Builder配合@Value生成不可变类时,自动生成的Builder内部类默认没有公开的无参构造方法,这就导致继承它实现Spring的FactoryBean时会触发编译错误。

解决方法:显式声明Builder类并添加@NoArgsConstructor

你只需要在SocketConfig类中显式定义内部Builder类,并用Lombok的@NoArgsConstructor标注它,Lombok会自动帮你补全Builder的逻辑,同时生成公开的无参构造方法。修改后的代码如下:

import lombok.*;

@Value
@Builder
public final class SocketConfig {
    @Builder.Default
    private int soTimeoutMilliseconds = 0;
    @Builder.Default
    private boolean soReuseAddress = false;
    @Builder.Default
    private int soLingerSeconds = -1;
    private boolean soKeepAlive;
    @Builder.Default
    private boolean tcpNoDelay = false;

    // 显式声明Builder类,添加无参构造
    @NoArgsConstructor
    public static class SocketConfigBuilder {
        // Lombok会自动填充所有Builder字段和build()方法,无需手动编写
    }
}

为什么这样有效?

默认情况下,Lombok生成的SocketConfigBuilder类只有包级访问权限的构造方法(甚至没有公开的无参构造),而Java继承机制要求子类构造器必须能访问父类的构造器。通过显式声明Builder类并添加@NoArgsConstructor,我们让Builder拥有了公开的无参构造方法,这样你的SocketConfigFactoryBean继承它时就不会触发编译错误了。

验证你的FactoryBean实现

现在你的SocketConfigFactoryBean可以正常编译和使用,两种Builder实例创建方式都能生效:

  1. 通过静态方法:SocketConfig.builder()
  2. 通过直接实例化:new SocketConfig.SocketConfigBuilder()

你的FactoryBean代码无需修改,就能正常工作:

import org.springframework.beans.factory.FactoryBean;

public class SocketConfigFactoryBean extends SocketConfig.SocketConfigBuilder implements FactoryBean<SocketConfig> {
    @Override
    public SocketConfig getObject() throws Exception {
        return build();
    }

    @Override
    public Class<?> getObjectType() {
        return SocketConfig.class;
    }

    @Override
    public boolean isSingleton() {
        return false;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:32:55