Lombok @ToString注解生成@NonNull数组字段异常字符串问题
解决Lombok @ToString注解数组字段输出异常问题
问题场景
使用Lombok的@ToString注解生成类的toString方法时,对于带有双重@NonNull修饰的数组字段:
private @NonNull String @NonNull [] answers;
生成的toString输出并未展示数组实际内容,而是输出了数组对象的默认toString结果:
SongEntryDto(answers=[Ljava.lang.String;@68f7aae2)
解决方案
方案1:自定义字段转换方法(推荐)
在类中添加一个自定义方法,将数组转换为可读字符串,通过@ToString.Include指定该方法替代原字段的输出:
@Getter @Builder @ToString public class SongEntryDto extends EntityDto { @ToString.Exclude private byte @NonNull [] data; private @NonNull String @NonNull [] answers; @ToString.Include(name = "answers") private String formatAnswers() { // 一维数组用Arrays.toString,多维数组用Arrays.deepToString return Arrays.toString(answers); } }
方案2:全局配置Lombok数组处理策略
在项目根目录创建lombok.config文件,添加以下配置,让Lombok自动对数组使用深度toString转换:
# 配置toString时对数组使用deepToString输出 lombok.toString.arrayStyle = DEEP
该配置会让Lombok在生成toString方法时,自动调用Arrays.deepToString()处理所有数组类型字段,无需逐个字段配置。
方案3:手动重写toString方法
如果不想依赖Lombok的自动生成逻辑,可直接手动重写toString方法,自行处理数组的输出:
@Getter @Builder public class SongEntryDto extends EntityDto { @ToString.Exclude private byte @NonNull [] data; private @NonNull String @NonNull [] answers; @Override public String toString() { return "SongEntryDto{" + "answers=" + Arrays.toString(answers) + '}'; } }
问题原因
Lombok默认的toString生成逻辑,对于带有多重注解(如双重@NonNull)修饰的数组字段,未能正确识别其数组类型,因此未调用数组专用的toString处理逻辑,而是直接使用了Object.toString(),导致输出数组的哈希码形式。
内容的提问来源于stack exchange,提问作者sixqf
相关产品推荐
相关产品推荐

