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)
如何解决这个问题呢?
如何创建自定义解串器?
假设我有如下付款
@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)