FasterXML / jackson-module-kotlin

Module that adds support for serialization/deserialization of Kotlin (http://kotlinlang.org) classes and data classes.
Apache License 2.0
1.13k stars 175 forks source link

class deserialization behaviour changes when to 2.10.1+ #317

Closed kelvinc1024 closed 1 year ago

kelvinc1024 commented 4 years ago

compile "com.fasterxml.jackson.module:jackson-module-kotlin:2.9.9"

change to

compile "com.fasterxml.jackson.module:jackson-module-kotlin:2.10.1"

cause following test code was that originally AC become error

Expected: fieldA
     but none found
 ; 
Unexpected: isFieldA

java.lang.AssertionError: 
Expected: fieldA
     but none found
 ; 
Unexpected: isFieldA
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.registerKotlinModule
import org.junit.Test
import org.skyscreamer.jsonassert.JSONAssert

class JsonSerializeDeserializeTest() {

    val objectMapper: ObjectMapper

    init {
        objectMapper = ObjectMapper().registerKotlinModule()
    }

    @Test
    fun jsonSeserializeTestSubjectA() {
        JSONAssert.assertEquals(
            """
                    {
                        "fieldA" : true,
                        "fieldB" : true,
                        "fieldC" : "hola mundo"
                    }
                """.trimIndent(),
            objectMapper.writeValueAsString(TestSubjectA(true, true, "hola mundo")),
            true
        )
    }

    @Test
    fun jsonSeserializeTestSubjectB() {
        JSONAssert.assertEquals(
            """
                    {
                        "fieldA" : true,
                        "fieldB" : true,
                        "fieldC" : "hola mundo"
                    }
                """.trimIndent(),
            objectMapper.writeValueAsString(TestSubjectB(true, true, "hola mundo")),
            true
        )
    }
}
import kotlin.Metadata;
import org.jetbrains.annotations.NotNull;

@Metadata(
        mv = {1, 1, 16},
        bv = {1, 0, 3},
        k = 1,
        d1 = {"\u0000\"\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0000\n\u0002\u0010\u000b\n\u0002\b\u0002\n\u0002\u0010\u000e\n\u0002\b\f\n\u0002\u0010\b\n\u0002\b\u0002\b\u0087\b\u0018\u00002\u00020\u0001B\u001d\u0012\u0006\u0010\u0002\u001a\u00020\u0003\u0012\u0006\u0010\u0004\u001a\u00020\u0003\u0012\u0006\u0010\u0005\u001a\u00020\u0006¢\u0006\u0002\u0010\u0007J\t\u0010\f\u001a\u00020\u0003HÆ\u0003J\t\u0010\r\u001a\u00020\u0003HÆ\u0003J\t\u0010\u000e\u001a\u00020\u0006HÆ\u0003J'\u0010\u000f\u001a\u00020\u00002\b\b\u0002\u0010\u0002\u001a\u00020\u00032\b\b\u0002\u0010\u0004\u001a\u00020\u00032\b\b\u0002\u0010\u0005\u001a\u00020\u0006HÆ\u0001J\u0013\u0010\u0010\u001a\u00020\u00032\b\u0010\u0011\u001a\u0004\u0018\u00010\u0001HÖ\u0003J\t\u0010\u0012\u001a\u00020\u0013HÖ\u0001J\t\u0010\u0014\u001a\u00020\u0006HÖ\u0001R\u0011\u0010\u0004\u001a\u00020\u0003¢\u0006\b\n\u0000\u001a\u0004\b\b\u0010\tR\u0011\u0010\u0005\u001a\u00020\u0006¢\u0006\b\n\u0000\u001a\u0004\b\n\u0010\u000bR\u0011\u0010\u0002\u001a\u00020\u0003¢\u0006\b\n\u0000\u001a\u0004\b\u0002\u0010\t¨\u0006\u0015"},
        d2 = {"Ljp/paypay/clmapi/integration/helper/TestSubjectB;", "", "isFieldA", "", "fieldB", "fieldC", "", "(ZZLjava/lang/String;)V", "getFieldB", "()Z", "getFieldC", "()Ljava/lang/String;", "component1", "component2", "component3", "copy", "equals", "other", "hashCode", "", "toString", "clm-api.test"}
)
public final class TestSubjectA {
    private final boolean isFieldA;
    private final boolean fieldB;
    @NotNull
    private final String fieldC;

    public final boolean isFieldA() {
        return this.isFieldA;
    }

    public final boolean getFieldB() {
        return this.fieldB;
    }

    @NotNull
    public final String getFieldC() {
        return this.fieldC;
    }

    public TestSubjectA(boolean isFieldA, boolean fieldB, @NotNull String fieldC) {
        super();
        this.isFieldA = isFieldA;
        this.fieldB = fieldB;
        this.fieldC = fieldC;
    }
}
data class TestSubjectB(
    val isFieldA: Boolean,
    val fieldB: Boolean,
    val fieldC: String
)

build.gradle

plugins {
    id 'java'
    id 'org.jetbrains.kotlin.jvm' version '1.3.60'
}

group 'org.example'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    compile 'com.fasterxml.jackson.core:jackson-core:2.10.1'
    compile 'com.fasterxml.jackson.core:jackson-annotations:2.10.1'
    compile 'com.fasterxml.jackson.core:jackson-databind:2.10.1'
//    compile "com.fasterxml.jackson.module:jackson-module-kotlin:2.9.9"
    compile "com.fasterxml.jackson.module:jackson-module-kotlin:2.10.1"
    testCompile group: 'junit', name: 'junit', version: '4.12'
    testCompile group: 'org.skyscreamer', name: 'jsonassert', version: '1.5.0'
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
kelvinc1024 commented 4 years ago

not sure that is the expected behaviour or not I saw the related ticket as well, but in reverse https://github.com/FasterXML/jackson-module-kotlin/issues/80

k163377 commented 1 year ago

It is considered resolved and closed.