为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实例创建方式都能生效:
- 通过静态方法:
SocketConfig.builder() - 通过直接实例化:
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
相关产品推荐
相关产品推荐

