Android Room @Embedded注解:库模块带@NonNull构造参数的POJO编译失败
我来帮你拆解这个Room编译报错的问题——其实这背后是Room注解处理器在跨模块处理类时的一个细节坑。当你把带@NonNull构造参数的POJO放在库模块里嵌入Room Entity时,Room的注解处理器没办法正确解析构造参数上的@NonNull注解,导致它误判构造函数不可用,也无法生成对应的Setter方法,于是就抛出了你看到的那两个错误。
下面给你几个靠谱的解决方案,你可以根据自己的项目情况选择:
移除构造参数上的
@NonNull注解
这是你已经发现的有效方法,去掉构造参数的@NonNull后,Room处理器能正常识别构造参数和字段的名称、类型匹配关系,自然就能生成需要的代码,编译也就通过了。如果需要保证非空约束,你可以把@NonNull移到字段本身或者对应的Getter方法上。将POJO迁移到应用模块
应用模块的注解处理器拥有更完整的类元信息访问权限,不会出现跨模块时的注解解析障碍,把POJO移过去之后,Room就能正常处理它的构造函数和字段了。给POJO添加无参构造函数+字段级
@NonNull
如果你不想改动模块结构或者移除构造参数的注解,可以给POJO加一个公共的无参构造函数,同时把@NonNull注解加到字段上。这样Room既能通过无参构造创建实例,又能保证字段的非空约束,示例代码如下:public class YourPojo { @NonNull private String yourField; // 公共无参构造函数 public YourPojo() {} // 带参数的构造函数保留也没问题 public YourPojo(@NonNull String yourField) { this.yourField = yourField; } // 对应的Getter和Setter @NonNull public String getYourField() { return yourField; } public void setYourField(@NonNull String yourField) { this.yourField = yourField; } }检查库模块的Room依赖配置
确保你的库模块build.gradle里正确引入了Room的注解处理器,并且版本和应用模块完全一致。比如Java项目用annotationProcessor,Kotlin项目用kapt:dependencies { implementation "androidx.room:room-runtime:2.6.1" // Java项目用这个 annotationProcessor "androidx.room:room-compiler:2.6.1" // Kotlin项目替换成下面这个 // kapt "androidx.room:room-compiler:2.6.1" }
总结一下,这个问题的核心就是跨模块场景下,Room处理器对构造参数上的@NonNull注解解析不兼容,通过调整注解位置、构造函数形式或者模块归属,就能轻松解决啦。
内容的提问来源于stack exchange,提问作者nightlytrails

