如何为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
相关产品推荐
相关产品推荐

