diff --git a/release-notes/CREDITS-2.x b/release-notes/CREDITS-2.x index 5ee73efe1..3ae243a14 100644 --- a/release-notes/CREDITS-2.x +++ b/release-notes/CREDITS-2.x @@ -16,6 +16,7 @@ Authors: Contributors: # 2.17.0 (not yet released) +* #727: Fixed overriding findCreatorAnnotation instead of hasCreatorAnnotation # 2.16.0 diff --git a/release-notes/VERSION-2.x b/release-notes/VERSION-2.x index 707dcdf1f..85677a036 100644 --- a/release-notes/VERSION-2.x +++ b/release-notes/VERSION-2.x @@ -18,7 +18,7 @@ Co-maintainers: 2.17.0 (not yet released) -- +#727: Fixed overriding findCreatorAnnotation instead of hasCreatorAnnotation. 2.16.0 (15-Nov-2023) diff --git a/src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinAnnotationIntrospector.kt b/src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinAnnotationIntrospector.kt index a06bd0142..bd61b9793 100644 --- a/src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinAnnotationIntrospector.kt +++ b/src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinAnnotationIntrospector.kt @@ -1,11 +1,9 @@ package com.fasterxml.jackson.module.kotlin -import com.fasterxml.jackson.annotation.JsonCreator import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.databind.DeserializationFeature import com.fasterxml.jackson.databind.JsonSerializer import com.fasterxml.jackson.databind.Module -import com.fasterxml.jackson.databind.cfg.MapperConfig import com.fasterxml.jackson.databind.introspect.* import com.fasterxml.jackson.databind.jsontype.NamedType import com.fasterxml.jackson.databind.util.Converter @@ -59,15 +57,6 @@ internal class KotlinAnnotationIntrospector( return hasRequired } - override fun findCreatorAnnotation(config: MapperConfig<*>, a: Annotated): JsonCreator.Mode? { - - // TODO: possible work around for JsonValue class that requires the class constructor to have the JsonCreator(Mode.DELEGATED) set? - // since we infer the creator at times for these methods, the wrong mode could be implied. - - // findCreatorBinding used to be a clearer way to set this, but we need to set the mode here to disambugiate the intent of the constructor - return super.findCreatorAnnotation(config, a) - } - override fun findSerializationConverter(a: Annotated): Converter<*, *>? = when (a) { // Find a converter to handle the case where the getter returns an unboxed value from the value class. is AnnotatedMethod -> a.findValueClassReturnType()?.let { diff --git a/src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinNamesAnnotationIntrospector.kt b/src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinNamesAnnotationIntrospector.kt index aaca6ccb5..babe8e921 100644 --- a/src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinNamesAnnotationIntrospector.kt +++ b/src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinNamesAnnotationIntrospector.kt @@ -2,6 +2,7 @@ package com.fasterxml.jackson.module.kotlin import com.fasterxml.jackson.annotation.JsonCreator import com.fasterxml.jackson.annotation.JsonProperty +import com.fasterxml.jackson.databind.cfg.MapperConfig import com.fasterxml.jackson.databind.introspect.Annotated import com.fasterxml.jackson.databind.introspect.AnnotatedConstructor import com.fasterxml.jackson.databind.introspect.AnnotatedMember @@ -111,11 +112,15 @@ internal class KotlinNamesAnnotationIntrospector( } } - override fun hasCreatorAnnotation(member: Annotated): Boolean = - if (member is AnnotatedConstructor && member.isKotlinConstructorWithParameters()) - cache.checkConstructorIsCreatorAnnotated(member) { hasCreatorAnnotation(it) } - else - false + // TODO: possible work around for JsonValue class that requires the class constructor to have the JsonCreator(DELEGATED) set? + // since we infer the creator at times for these methods, the wrong mode could be implied. + override fun findCreatorAnnotation(config: MapperConfig<*>, ann: Annotated): JsonCreator.Mode? { + if (ann !is AnnotatedConstructor || !ann.isKotlinConstructorWithParameters()) return null + + return JsonCreator.Mode.DEFAULT.takeIf { + cache.checkConstructorIsCreatorAnnotated(ann) { hasCreatorAnnotation(it) } + } + } @Suppress("UNCHECKED_CAST") private fun findKotlinParameterName(param: AnnotatedParameter): String? {