Lombok实际场景中的高频问题与解决方案

🍰 个人主页:不摆烂的小劉
🍞文章有不合理的地方请各位大佬指正。
🍉文章不定期持续更新,如果我的文章对你有帮助➡️ 关注🙏🏻 点赞👍 收藏⭐️


在实际开发中, 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原因

  1. child2.equals(child1)返回true,因为两者name字段相同, 但父类的id字段不同id=1 id=2,本应视为不同对象,由于Childequals未调用super.equals(),忽略了id的比较
  2. 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未生成无参构造函数,而SpringJSON反序列化工具依赖无参构造函数创建实例,最终因无法生成实例引发接口回调报错

1.3解决

添加@AllArgsConstructor@NoArgsConstructor注解

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class CallbackResponse {
   private String status;
   private String message;
}

🍉文章不定期持续更新,如果我的文章对你有帮助➡️ 关注🙏🏻 点赞👍 收藏⭐️

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值