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

如何为Lombok @Builder生成的Builder类添加自定义toJsonString方法

问题

给定如下使用Lombok注解标注的类:

@Builder
public class User {
    private String username;
}

现有用于测试场景创建User对象的工具类:

public class UserTestUtils {
    public static final String DEFAULT_USERNAME = "Foo Bar";

    public static User.UserBuilder aDefaultUser() {
        return User.builder().username(DEFAULT_USERNAME);
    }
}

当前测试代码中可以按如下方式调用工具方法构建对象:

User user = aDefaultUser().build();

现在需要扩展工具能力,新增方法不直接返回User对象,而是返回对应对象的JSON字符串表示,期望调用形式如下:

String userJson = aDefaultUser().toJsonString();

请问是否可以向Lombok自动生成的User.UserBuilder类中添加自定义的toJsonString()方法?


答案

可以,不用额外引入其他插件,Lombok原生就支持对生成的Builder类做自定义扩展。

Lombok处理@Builder注解时,如果发现被标注的类里已经存在同名的静态内部Builder类(也就是本例的User.UserBuilder),不会直接覆盖重写整个类,只会自动把需要生成的字段赋值方法(比如username())、build()方法、必要的成员变量补进去,你自己写的自定义方法会完整保留下来。

实现起来很简单,直接在User类里手动写一个UserBuilder静态内部类,把toJsonString()方法加进去就行,参考代码:

@Builder
public class User {
    private String username;

    public static class UserBuilder {
        public String toJsonString() {
            // 换成你项目里实际用的JSON工具就行,这里举Gson的例子
            return new com.google.gson.Gson().toJson(this.build());
        }
    }
}

注意事项:

  • 别在自己写的UserBuilder里定义和Lombok生成逻辑重名的方法、字段,比如不要自己写username()、build()方法,也不要手动声明username这类和实体类字段重名的成员变量,避免逻辑冲突。
  • 原问题里最初写的期望调用示例存在类型笔误:toJsonString()返回的是JSON字符串,应该用String类型接收,不能直接赋值给User类型变量。

如果你因为某些原因不能修改User类的源码,也可以写个静态工具方法接收UserBuilder参数做序列化,只是调用形式会变成普通静态方法调用,做不到链式调用效果,优先用上面的扩展方案即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 08:06:18