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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:50:13