Kotlin:内联类的 Jackson 反序列化

Dac*_*ein 9 inline exception class jackson kotlin

可以说我有

inline class CustomId(val id: String)
Run Code Online (Sandbox Code Playgroud)

我使用 Jackson 将它反序列化回一个对象,Jackson 抛出一个异常:

无效定义异常
Cannot construct instance of CustomId (no Creators, like default construct, exist)

如何解决这个问题呢?
如何创建自定义解串器?

Dan*_*cob 3

假设我有如下付款

@JvmInline
value class PaymentMethod(val method: String)

data class Payment(val Method: PaymentMethod)

data class PaymentDto(val method: PaymentMethod) {
    companion object {
        @JvmStatic
        @JsonCreator
        fun create(method: String) = PaymentDto(PaymentMethod(method))
    }
}
Run Code Online (Sandbox Code Playgroud)

JVM 上的内联类或值类将被序列化为字符串。为了将其反序列化为内联类,您可以使用@JsonCreator. 以下两个测试表明该值已正确反序列化回包装器

@Test
fun `should send wrapper as string`() {
    val objectMapper = jacksonObjectMapper().findAndRegisterModules()
    val payment = Payment(PaymentMethod("PAYPAL"))
    val expectedJson = """{"method":"PAYPAL"}"""

    val json = objectMapper.writeValueAsString(payment)

    assertNotNull(json)
    assertEquals(expectedJson, json)
}

@Test
fun `should deserialize string as inline class`() {
    val objectMapper = jacksonObjectMapper().findAndRegisterModules()
    val payment = Payment(PaymentMethod("PAYPAL"))
    val json = objectMapper.writeValueAsString(payment)

    val result =  assertDoesNotThrow { objectMapper.readValue<PaymentDto>(json) }

    assertNotNull(result)
    assertEquals(result.method.method, "PAYPAL")
}
Run Code Online (Sandbox Code Playgroud)