如何用Lombok @ToString跳过Null字段?是否有简便配置或最佳实践?
解决Lombok @ToString过滤Null字段的问题
嘿,不用纠结AOP啦,Lombok本身就有简便的配置可以实现跳过Null字段的需求,而且这才是最符合Lombok设计初衷的做法——让你少写冗余代码,又能灵活定制!
一、直接用Lombok的内置配置
从Lombok 1.18.16版本开始,@ToString注解新增了nullsExcluded = true这个参数,只要加上它,生成的toString方法就会自动忽略值为null的字段。
举个实际的代码例子:
import lombok.ToString; @ToString(nullsExcluded = true) public class User { private String username; private Integer age; private String phone; // 构造器、getter/setter 省略 }
假设age字段为null,那么调用toString()得到的结果会是User(username=Alice, phone=123456),完全不会出现age=null的部分。
二、低版本Lombok的替代方案
如果你的项目还在使用低于1.18.16的Lombok版本,也不用急着手写整个toString。可以结合@ToString(onlyExplicitlyIncluded = true)和@ToString.Include,再配合字段的非空判断:
import lombok.ToString; @ToString(onlyExplicitlyIncluded = true) public class User { @ToString.Include private String username; @ToString.Include(ifNull = ToString.Include.IfNull.SKIP) private Integer age; @ToString.Include(ifNull = ToString.Include.IfNull.SKIP) private String phone; // 构造器、getter/setter 省略 }
不过说实话,直接升级Lombok到最新稳定版会更省心,毕竟低版本的这种写法还是有点繁琐。
三、关于AOP方案的看法
你提到的AOP全局自定义toString思路确实可行,但非常不推荐作为这个场景的解决方案:
- 首先,Lombok已经提供了开箱即用的配置,用AOP完全是画蛇添足,增加了系统的复杂度;
- 其次,toString是Java类的基础方法,用AOP拦截可能会和其他自定义toString的类产生冲突,甚至引发一些意想不到的性能问题;
- 最后,全局统一修改toString的行为,可能会让其他维护者感到困惑——毕竟这不符合常规的编码习惯。
所以,优先用Lombok自带的nullsExcluded配置就好啦!
内容的提问来源于stack exchange,提问作者patrick BAK
相关产品推荐
相关产品推荐

