解决Android Studio发生Room在Lombok下报错Cannot find setter for field

问题描述

  笔者在安卓数据库框架 Room 中发现数据库实体类(@Entity)发生了如下报错。

错误: Cannot find setter for field.

笔者报错时的运行环境:

  • Android Studio Flamingo | 2022.2.1

  • Android SDK 33

  • Gradle 8.0.1

  • JDK 17

  • Room 2.5.1

  • Lombok 1.18.26

  • Lombok 插件 0.34-2020.2

问题探索

  这个报错已经很表意了,它说明这个实体类没有 setter 方法。但是很奇怪,因为笔者明明对该实体类使用了 Lombok 注解 @Setter,所以不应该有这个报错。难道是 Lombok 没有生效,或者 Lombok 对 Room 无效?

  因为这个报错只出现在笔者其中一个涉及数据库的模块中,所以不是没有引入 Lombok 依赖的问题。起初,笔者以为是在 Gradle 依赖时,Room 依赖的位置比 Lombok 要靠前,但发现笔者当初早在一开始就把 Lombok 放在了首位,所以也不是这个问题。

  于是笔者不断更换 Lombok 的注解、删除 Lombok 的所有注解、使用手动的 gettersetter 方法,终于让笔者发现了原因所在。

在 Gradle 中使用 Lombok 的注意事项

  1. Lombok 的这两个依赖关键字 implementation、annotationProcessor 同时不能少。

    • 如果缺少 implementation,则在 IDE 中会直接报红,编译和运行也会直接失败。

    • 如果缺少 annotationProcessor,则编译和运行会直接失败。

  2. Lombok 依赖不具有传递性,在每个使用它的模块都要注明对它的依赖(在依赖模块中对 Lombok 使用关键字 api 也没用)。

缘由

  因为上面只对 setter 方法报不存在的错误,而没有对 getter 方法报这个错误,所以 Lombok 实际上还是生效了的。问题就在于,笔者画蛇添足地在实体类上增加了如下代码。

@Accessors(chain = true)

  因为笔者很喜欢 流式编程,所以很喜欢加上面那个注解。但 Room 只认返回值为 void 的 setter 方法,所以这样就显得 Lombok 不起作用一样。

  所以对笔者这种情况,只需要删除上面那个 Lombok 注解即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值