FasterXML / FasterXML/jackson-module-kotlin

Deserialization fails for local data class with local default value

Aperta
#712 3 commenti 0 reazioni 0 assegnatari Vedi su GitHub
bug
Lingua principale
Kotlin
Stelle
1.2k
Fork
187
Merge medio
9h 48m
PR unite (30g)
16

Descrizione

### Search before asking

- [X] I searched in the [issues](https://github.com/FasterXML/jackson-module-kotlin/issues) and found nothing similar.

### Describe the bug

When I try to serialize json to local data class, which also has a param with default value taken from local variable - it fails with com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Invalid type definition

It works if the default value is set as is or if default value is coming from top level variable or from class local variable.

### To Reproduce

```kotlin

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.KotlinModule
import com.fasterxml.jackson.module.kotlin.readValue

val defaultTopLevelValue = "top level"

object Main {
val defaultInClass = "class"

@JvmStatic
fun main(args: Array) {
val json = ObjectMapper().registerModule(KotlinModule())
val defaultLocalValue = "local"

data class Local(val a: String = defaultLocalValue)
data class InClass(val a: String = defaultInClass)
data class TopLevel(val a: String = defaultTopLevelValue)
data class Const(val a: String = "const")

val str = """{}"""
json.readValue(str).also(::println) // works
json.readValue(str).also(::println) // works
json.readValue(str).also(::println) // works
json.readValue(str).also(::println) // fails - Invalid type definition for type `com.sedex.connect.questionnaire.pact.Main$main$Local`: Argument #0 of constructor [constructor for `com.sedex.connect.questionnaire.pact.Main$main$Local` (2 args), annotations: [null] has no property name (and is not Injectable): can not use as property-based Creator
}
}

```

stacktrace:
```
Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Invalid type definition for type `com.sedex.connect.questionnaire.pact.Main$main$Local`: Argument #0 of constructor [constructor for `com.sedex.connect.questionnaire.pact.Main$main$Local` (2 args), annotations: [null] has no property name (and is not Injectable): can not use as property-based Creator
at [Source: (String)"{}"; line: 1, column: 1]
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:62)
at com.fasterxml.jackson.databind.DeserializationContext.reportBadTypeDefinition(DeserializationContext.java:1893)
at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._validateNamedPropertyParameter(BasicDeserializerFactory.java:1162)
at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._addExplicitPropertyCreator(BasicDeserializerFactory.java:879)
at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._addExplicitAnyCreator(BasicDeserializerFactory.java:926)
at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._addExplicitConstructorCreators(BasicDeserializerFactory.java:466)
at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._constructDefaultValueInstantiator(BasicDeserializerFactory.java:293)
at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory.findValueInstantiator(BasicDeserializerFactory.java:222)
at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:262)
at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:151)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:415)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:350)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142)
at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:654)
at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:4956)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4826)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3772)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3755)
at com.sedex.connect.questionnaire.pact.Main.main(Test.kt:71)
```

### Expected behavior

data class is correctly serialized without failures

### Versions

Kotlin: 1.8.20
Jackson-module-kotlin: 2.15.2
Jackson-databind: 2.15.2

### Additional context

_No response_

Guida per i contributori

Nessuna guida per i contributori indicizzata per questo repository

Valutazione

Questa issue non è ancora stata valutata.

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.