diff --git a/extensions/resteasy-reactive/quarkus-resteasy-reactive-kotlin-serialization/runtime/src/main/kotlin/io/quarkus/kotlin/serialization/KotlinSerializationMessageBodyWriter.kt b/extensions/resteasy-reactive/quarkus-resteasy-reactive-kotlin-serialization/runtime/src/main/kotlin/io/quarkus/kotlin/serialization/KotlinSerializationMessageBodyWriter.kt index 134e5592e7ad6..866c528c7a4e3 100644 --- a/extensions/resteasy-reactive/quarkus-resteasy-reactive-kotlin-serialization/runtime/src/main/kotlin/io/quarkus/kotlin/serialization/KotlinSerializationMessageBodyWriter.kt +++ b/extensions/resteasy-reactive/quarkus-resteasy-reactive-kotlin-serialization/runtime/src/main/kotlin/io/quarkus/kotlin/serialization/KotlinSerializationMessageBodyWriter.kt @@ -30,7 +30,7 @@ class KotlinSerializationMessageBodyWriter(private val json: Json) : AllWriteabl if (o is String) { // YUK: done in order to avoid adding extra quotes... entityStream.write(o.toByteArray(StandardCharsets.UTF_8)) } else { - json.encodeToStream(serializer(o.javaClass), o, entityStream) + json.encodeToStream(serializer(genericType), o, entityStream) } } diff --git a/independent-projects/resteasy-reactive/common/runtime/src/main/java/org/jboss/resteasy/reactive/common/util/types/Types.java b/independent-projects/resteasy-reactive/common/runtime/src/main/java/org/jboss/resteasy/reactive/common/util/types/Types.java index c347a46697d44..de58afdeb503d 100644 --- a/independent-projects/resteasy-reactive/common/runtime/src/main/java/org/jboss/resteasy/reactive/common/util/types/Types.java +++ b/independent-projects/resteasy-reactive/common/runtime/src/main/java/org/jboss/resteasy/reactive/common/util/types/Types.java @@ -180,16 +180,20 @@ public static Type getEffectiveReturnType(Type returnType) { if (returnType instanceof ParameterizedType) { ParameterizedType type = (ParameterizedType) returnType; Type firstTypeArgument = type.getActualTypeArguments()[0]; - if (type.getRawType() == CompletionStage.class) { + Type rawType = type.getRawType(); + if (rawType == CompletionStage.class) { return getEffectiveReturnType(firstTypeArgument); } - if (type.getRawType() == Uni.class) { + if (rawType == Uni.class) { return getEffectiveReturnType(firstTypeArgument); } - if (type.getRawType() == Multi.class) { + if (rawType == Multi.class) { return getEffectiveReturnType(firstTypeArgument); } - if (type.getRawType() == RestResponse.class) { + if (rawType == RestResponse.class) { + return getEffectiveReturnType(firstTypeArgument); + } + if ("kotlinx.coroutines.flow.Flow".equals(rawType.getTypeName())) { // TODO: this is very ugly and we should probably use some an SPI in order to decouple return getEffectiveReturnType(firstTypeArgument); } return returnType;