🍰 个人主页:不摆烂的小劉
🍞文章有不合理的地方请各位大佬指正。
🍉文章不定期持续更新,如果我的文章对你有帮助➡️ 关注🙏🏻 点赞👍 收藏⭐️
在实际开发中,
Lombok因其简化代码的特性被广泛使用,但也可能引发一些高频问题。以下是基于常见场景的问题分类及解决方案。
1. 添加@Data导致List无法正确删除元素
子类使用 @Data生成的equals默认不调用父类(callSuper=false),导致 List.remove()时仅比较子类字段,无法正确删除元素
1.1 代码举例
//父类
@Data
public class Parent {
private int id;
}
// 子类
// 等价于 @Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor
@Data
public class Child extends Parent {
private String name;
}
测试删除集合元素
public static void main(String[] args) {
// 1创建列表并添加子类对象
List<Parent> list = new ArrayList<>();
Child child1 = new Child();
child1.setId(1);
child1.setName("Alice");
list.add(child1);
// 2构造另一个子类对象(ID不同,但NAME相同)
Child child2 = new Child();
child2.setId(2); // ID不同
child2.setName("Alice"); // NAME相同
// 3尝试从列表中移除child2
boolean isRemoved = list.remove(child2);
// 输出:true(错误!)
System.out.println("是否成功移除?" + isRemoved);
// 输出:0(原元素被误删)
System.out.println("列表大小:" + list.size());
}
1.2原因
child2.equals(child1)返回true,因为两者name字段相同, 但父类的id字段不同id=1 id=2,本应视为不同对象,由于Child的equals未调用super.equals(),忽略了id的比较List<Parent>中存储的是Child对象,但在remove()时依赖equals判断
1.3解决
子类使用@EqualsAndHashCode(callSuper = true)
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
// 显式包含父类字段
@EqualsAndHashCode(callSuper = true)
public class Child extends Parent {
private String name;
}
执行后的代码
// 输出:false(正确!)
System.out.println("是否成功移除?" + isRemoved);
// 输出:1(元素保留)
System.out.println("列表大小:" + list.size());
2. @Builder 未添加无参构造器导致报错
1.1代码举例
@Data
@Builder
public class CallbackResponse {
private String status;
private String message;
}
测试代码
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
String json = "{\"status\":\"success\",\"message\":\"OK\"}";
// 尝试反序列化为 CallbackResponse
CallbackResponse response = mapper.readValue(json, CallbackResponse.class);
System.out.println(response);
}
结果

1.2 原因
接口回调类添加@Builder注解时未同时添加@NoArgsConstructor,导致Lombok未生成无参构造函数,而Spring及JSON反序列化工具依赖无参构造函数创建实例,最终因无法生成实例引发接口回调报错
1.3解决
添加@AllArgsConstructor、@NoArgsConstructor注解
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class CallbackResponse {
private String status;
private String message;
}
🍉文章不定期持续更新,如果我的文章对你有帮助➡️ 关注🙏🏻 点赞👍 收藏⭐️

9646

被折叠的 条评论
为什么被折叠?



