-
Notifications
You must be signed in to change notification settings - Fork 175
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Serialization and Deserialization of Kotlin data class
fails on PolymorphicTypeValidator with Any
#819
Comments
Kotlin issues belong under |
Created a PR because I found a problem with Will check again after this is merged. |
Checked. This is a new feature addition and an implementation policy should be discussed. @effx13 has submitted
As for the implementation, the base class of import com.fasterxml.jackson.annotation.JsonCreator
import com.fasterxml.jackson.annotation.JsonTypeInfo
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.databind.jsontype.BasicPolymorphicTypeValidator
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
import com.fasterxml.jackson.module.kotlin.registerKotlinModule
import kotlin.test.Test
class GitHub819 {
@JvmInline
value class ServerName(val value: String) {
companion object {
@JsonCreator
@JvmStatic
fun fromValue(value: String): ServerName {
return ServerName(value)
}
}
}
data class TestDto(
val serverName: ServerName
)
// on EVERYTHING
@Test
fun everything() {
val objectMapper = ObjectMapper()
.registerKotlinModule()
.registerModule(JavaTimeModule())
.activateDefaultTyping(
BasicPolymorphicTypeValidator.builder().allowIfBaseType(Any::class.java).build(),
ObjectMapper.DefaultTyping.EVERYTHING,
JsonTypeInfo.As.PROPERTY,
)
val serverName = ServerName("TEST")
val testDto = TestDto(serverName)
val serialized = objectMapper.writeValueAsString(testDto)
// -> {"@class":"com.fasterxml.jackson.module.kotlin.test.github.GitHub819$TestDto","serverName":["com.fasterxml.jackson.module.kotlin.test.github.GitHub819$ServerName","TEST"]}
println(serialized)
val deserialized = objectMapper.readValue(serialized, Any::class.java) // Because of RedisSerializer
// -> TestDto(serverName=ServerName(value=TEST))
println(deserialized)
}
} As a side note, as far as the prototype is concerned, I feel that it would be difficult to implement in any other way. |
@k163377 I agree, as you said, in BasicPolymorphicTypeValidator it should come out as |
👍
First, a version that incorporates the fix for the bug is required(2.18.1 or later). After that, you may be able to solve your use case by setting up a custom serializer based on As for the |
Quick note: 2.18.1 not yet released; will be released in near future (2-3 weeks), but need to combine with other fixes. |
Search before asking
Describe the bug
When trying to deserialize class that contains kotlin value class, Jackson throws
InvalidTypeIdException
withmissing type id property '@class'
onObjectMapper.DefaultTyping.NON_FINAL
Despite adding
@JsonCreator
annotation, I got the same result.And trying to serialize above class with
ObjectMapper.DefaultTyping.NON_FINAL
, Jackson throwsJsonMappingException
withclass ServerName cannot be cast to class java.lang.String (ServerName is in unnamed module of loader 'app'; java.lang.String is in module java.base of loader 'bootstrap') (through reference chain: TestDto["serverName"])
I'm using PolymorphicTypeValidator and Any class to do serialization and deserialization in Redis. But no matter what settings and annotations I use, the serialization and deserialization fails.
Version Information
JVM 21
Kotlin 1.8
jackson-core:2.17.2
jackson-databind:2.17.2
jackson-annotations:2.17.2
jackson-datatype-jsr310:2.17.2
jackson-module-kotlin:2.17.2
Reproduction
Expected behavior
No response
Additional context
No response
The text was updated successfully, but these errors were encountered: