Skip to content

Commit e650766

Browse files
k163377kkurczewski
authored andcommitted
Fixed conversion to be done by converter only
1 parent 4fba300 commit e650766

File tree

2 files changed

+16
-9
lines changed

2 files changed

+16
-9
lines changed

src/main/kotlin/com/fasterxml/jackson/module/kotlin/Converters.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,14 @@ internal class SequenceToIteratorConverter(private val input: JavaType) : StdCon
2121
?: typeFactory.constructType(Iterator::class.java)
2222
}
2323

24+
internal object KotlinDurationValueToJavaDurationConverter : StdConverter<Long, JavaDuration>() {
25+
private val boxConverter by lazy { ValueClassBoxConverter(Long::class.java, KotlinDuration::class) }
26+
27+
override fun convert(value: Long): JavaDuration = KotlinToJavaDurationConverter.convert(boxConverter.convert(value))
28+
}
29+
2430
internal object KotlinToJavaDurationConverter : StdConverter<KotlinDuration, JavaDuration>() {
2531
override fun convert(value: KotlinDuration) = value.toJavaDuration()
26-
27-
val delegatingSerializer: StdDelegatingSerializer by lazy { StdDelegatingSerializer(this) }
2832
}
2933

3034
/**

src/main/kotlin/com/fasterxml/jackson/module/kotlin/KotlinAnnotationIntrospector.kt

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import java.lang.reflect.AccessibleObject
1313
import java.lang.reflect.Constructor
1414
import java.lang.reflect.Field
1515
import java.lang.reflect.Method
16-
import java.lang.reflect.Modifier
1716
import kotlin.reflect.KClass
1817
import kotlin.reflect.KFunction
1918
import kotlin.reflect.KMutableProperty1
@@ -71,7 +70,16 @@ internal class KotlinAnnotationIntrospector(
7170

7271
override fun findSerializationConverter(a: Annotated): Converter<*, *>? = when (a) {
7372
// Find a converter to handle the case where the getter returns an unboxed value from the value class.
74-
is AnnotatedMethod -> a.findValueClassReturnType()?.let { cache.getValueClassBoxConverter(a.rawReturnType, it) }
73+
is AnnotatedMethod -> a.findValueClassReturnType()?.let {
74+
if (useJavaDurationConversion && it == Duration::class) {
75+
if (a.rawReturnType == Duration::class.java)
76+
KotlinToJavaDurationConverter
77+
else
78+
KotlinDurationValueToJavaDurationConverter
79+
} else {
80+
cache.getValueClassBoxConverter(a.rawReturnType, it)
81+
}
82+
}
7583
is AnnotatedClass -> lookupKotlinTypeConverter(a)
7684
else -> null
7785
}
@@ -94,11 +102,6 @@ internal class KotlinAnnotationIntrospector(
94102
?.takeIf { it.requireRebox() }
95103
?.let { cache.getValueClassBoxConverter(am.rawReturnType, it).delegatingSerializer }
96104

97-
override fun findSerializer(am: Annotated): Any? = when ((am as? AnnotatedMethod)?.findValueClassReturnType()) {
98-
Duration::class -> KotlinToJavaDurationConverter.delegatingSerializer.takeIf { useJavaDurationConversion }
99-
else -> null
100-
} ?: super.findSerializer(am)
101-
102105
override fun findDeserializationConverter(a: Annotated): Any? {
103106
if (!useJavaDurationConversion) return null
104107

0 commit comments

Comments
 (0)