错误:找不到字段的设置器。 - java.util.ArrayList 中的大小 - Room 中的嵌入式 ArrayList 无法编译

Posted

技术标签:

【中文标题】错误:找不到字段的设置器。 - java.util.ArrayList 中的大小 - Room 中的嵌入式 ArrayList 无法编译【英文标题】:error: Cannot find setter for field. - size in java.util.ArrayList - Embedded ArrayList in Room unable to compile 【发布时间】:2021-09-23 20:57:06 【问题描述】:

我在将 android 4.1.2 更新到 4.2.2 后收到此错误消息,但在将我的 Android Studio 更新到 4.1.2 以上的任何版本后收到此错误

* What went wrong:
Execution failed for task ':core:kaptDebugKotlin'.
> A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution
   > java.lang.reflect.InvocationTargetException (no error message)

查看构建错误时,我发现了这个错误

error: Cannot find setter for field. - size in java.util.ArrayList/Users/xxxxx/XXXXX.Core-Android/core/build/tmp/kapt3/stubs/debug/com/XXXXX/android/core/entities/user/User.java:91: warning: Primary key constraint on placeId is ignored when being merged into com.xxxx.android.core.entities.user.User

几乎没有其他与error: Cannot find setter for field. - size in java.util.ArrayList 语言相似的错误消息

我无法发布完整的课程,但我相信这些是相关部分。在这个类中 ArrayList 只使用一次

@Entity
data class User(
    @PrimaryKey @JsonProperty("userId") var userId: Int = 0,
    @JsonProperty("email") override var email: String?,
    ...
    @JsonProperty("place") @Embedded var place: Place?,
    @JsonProperty("thing") @Embedded var thing: ArrayList<Thing>? = ArrayList(),
    ...
) : UserType

检查我发现的 UserDao_Impl.java 时

final ArrayList<E> _tmpThing;
            if (! (_cursor.isNull(_cursorIndexOfSize))) 
              _tmpThing = new ArrayList();
              _tmpThing.size = _cursor.getInt(_cursorIndexOfSize);
              else  
              _tmpThing = null;
            

_tmpThing.size = _cursor.getInt(_cursorIndexOfSize); 出现错误,其他开发人员的构建中没有此部分

我相信它可能与@Embedded var thing: ArrayList&lt;Thing&gt;?有关

非常奇怪的是,另一个开发人员也将他们的 Android Studio 更新到了 4.2.2,并且能够很好地编译项目,所以我相信这是我的机器,但是在完全擦除之后我收到了这个错误我的机器和最小的安装,只是通过 Toolbox 安装的 Android Studio。

我尝试过的事情

将 Gradle 更新到 6.7.1 并将插件更新到 com.android.tools.build:gradle:4.2.2,同样的错误 为thing: ArrayList&lt;Thing&gt;? 创建类型转换器,同样的错误 将thing: ArrayList&lt;Thing&gt;? 更改为列表,Entities and POJOs must have a usable public constructor 错误 将 kapt "androidx.room:room-compiler:2.3.0" 更改为 annotationProcessor "androidx.room:room-compiler:2.3.0",编译并通过所有测试,但在调用任何数据库方法时我收到运行时崩溃 将我的 JDK 从嵌入式更改为 JDK 11,同样的错误 添加kapt.use.worker.api=false,同样的错误

相关的gradle部分

buildscript 
    //Fallback versions
    ext 
        kotlin_version = '1.4.21'
        ...
    

    repositories 
        google()
        jcenter()
    
    dependencies 
        classpath 'com.android.tools.build:gradle:4.2.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        ....

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    

apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
apply plugin: 'digital.wup.android-maven-publish'
apply from: 'jacoco.gradle'

ext 
    ...
    room_version = "2.3.0"


android 
    compileSdkVersion 29
    buildToolsVersion '29.0.3'

    useLibrary 'android.test.runner'
    useLibrary 'android.test.base'
    useLibrary 'android.test.mock'

    kotlinOptions 
        jvmTarget = "1.8"
        freeCompilerArgs += ["-Xopt-in=kotlin.RequiresOptIn"]
    

    dataBinding 
        enabled true
    

    lintOptions 
        abortOnError false
    

    testOptions 
        unitTests 
            includeAndroidResources = true
        
    

    compileOptions 
        sourceCompatibility '1.8'
        targetCompatibility '1.8'
    

    defaultConfig 
        minSdkVersion 21
        targetSdkVersion 29
        versionCode computeVersionCode()
        versionName computeVersionName()
        consumerProguardFiles 'proguard-android.txt'

        ....

        javaCompileOptions 
            annotationProcessorOptions 
                arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]
            
        
    

    buildTypes 
        ...
        debug 
            testCoverageEnabled true

            debuggable true
            minifyEnabled false

            buildConfigField "String", "BUILD_VARIANT", "\"DEBUG\""
        

        local 
            initWith debug
        
    


dependencies 
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"

    kapt "androidx.room:room-compiler:$room_version"

    //Android Core Libraries
    api "androidx.room:room-runtime:$room_version"
    api "androidx.room:room-ktx:$room_version"

    kapt "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"

    ....

    //Asynchronous Programming
    def coroutines = '1.4.2'
    api "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines"
    api "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines"

    //Network/Json Parsing Libraries
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:4.9.1'
    implementation 'com.squareup.retrofit2:converter-jackson:2.9.0'

    def jackson = '2.12.4'
    api "com.fasterxml.jackson.core:jackson-core:$jackson"
    api "com.fasterxml.jackson.core:jackson-databind:$jackson"
    api "com.fasterxml.jackson.core:jackson-annotations:$jackson"
    api "com.fasterxml.jackson.module:jackson-module-kotlin:$jackson"
    implementation "com.fasterxml.jackson.datatype:jackson-datatype-joda:$jackson"

    //Dependency Injection
    def koin = "2.0.1"
    api "org.koin:koin-androidx-viewmodel:$koin"

    ....

    //Test Libraries
    testImplementation group: 'junit', name: 'junit', version: '4.12'
    testImplementation 'org.robolectric:robolectric:4.4'
    testImplementation 'com.github.javafaker:javafaker:1.0.1'
    testImplementation "org.koin:koin-test:$koin"

    testImplementation 'androidx.test:core:1.2.0'
    testImplementation 'androidx.test:runner:1.2.0'
    testImplementation 'androidx.test:rules:1.2.0'
    testImplementation 'androidx.test.ext:junit:1.1.1'

    testImplementation "io.mockk:mockk:1.12.0"
    testImplementation "androidx.arch.core:core-testing:2.1.0"
    testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.3.2'

【问题讨论】:

没有ArrayList&lt;E&gt;.setSize,也没有暴露的可赋值size字段,所以..developer.android.com/reference/java/util/ArrayList 那么,它是如何到达那里的呢? :| 【参考方案1】:

问题在于较新版本的 Android Studio 和我们当前的 Gradle 设置中内置的 JDK,尤其是这个块

android 
    kotlinOptions 
        jvmTarget = "1.8"
    

Android Studio 附带的内置 JDK 冲突。一旦我将 Android Studio 指向 Java 1.8 JDK,它就会在我的机器和新机器上编译。

在我当前的机器上,我使用 SDKMan 安装了 AdoptOpenJDK 8.0.292.hs。在我以前的机器上,我使用 Homebrew 安装了 OpenJDK 1.8

然后我去了File -&gt; Project Structure -&gt; SDK Location -&gt; JDK Location,将JDK指向新安装的1.8而不是内置的JDK。

对于 SDKMan,路径是 /Users/me/.sdkman/candidates/java/8.0.292.hs-adpt

【讨论】:

SDK man 是一个非常棒的 CL 来管理版本sdkman.io 链接,以防阅读答案的人想尝试一下【参考方案2】:

我遇到了类似的问题,只需从位于实体中的 ArrayList 属性中删除注释“@Embedded”即可。

【讨论】:

以上是关于错误:找不到字段的设置器。 - java.util.ArrayList 中的大小 - Room 中的嵌入式 ArrayList 无法编译的主要内容,如果未能解决你的问题,请参考以下文章

Android Room 库错误:找不到字段的设置器。 (科特林)

找不到 Java 类 java.util.ArrayList 和 MIME 媒体类型 application/json 的消息正文编写器

严重:找不到 Java 类 java.util.ArrayList 和 MIME 媒体类型 application/json 的消息正文编写器

EL1008E: 在“java.util.ArrayList”类型的对象上找不到属性或字段“内容” - 可能不是公共的或无效的?

Room Kotlin 找不到字段的设置器

@Embeddables 的 @ElementCollection 每个都具有 @Embeddable 字段导致“找不到设置器”异常