
com.jakewharton.rs.kotlinx.serialization.KotlinxSerializationMessageBodyWriter.kt Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jax-rs-kotlinx-serialization Show documentation
Show all versions of jax-rs-kotlinx-serialization Show documentation
Message body reader/writer and parameter converter which uses Kotlinx Serialization
@file:JvmName("KotlinxSerializationMessageBodyWriter")
package com.jakewharton.rs.kotlinx.serialization
import kotlinx.serialization.BinaryFormat
import kotlinx.serialization.StringFormat
import kotlinx.serialization.serializerByTypeToken
import java.io.OutputStream
import java.lang.reflect.Type
import java.nio.charset.Charset
import javax.ws.rs.core.MediaType
import javax.ws.rs.core.MultivaluedMap
import javax.ws.rs.ext.MessageBodyWriter
@JvmName("create")
fun StringFormat.asMessageBodyWriter(vararg mediaTypes: MediaType): MessageBodyWriter {
return StringFormatMessageBodyWriter(this, mediaTypes.toSet())
}
@JvmName("create")
fun BinaryFormat.asMessageBodyWriter(vararg mediaTypes: MediaType): MessageBodyWriter {
return BinaryFormatMessageBodyWriter(this, mediaTypes.toSet())
}
private class StringFormatMessageBodyWriter(
private val format: StringFormat,
private val mediaTypes: Set
) : MessageBodyWriter {
override fun isWriteable(
type: Class<*>,
genericType: Type,
annotations: Array?,
mediaType: MediaType
): Boolean {
return mediaType in mediaTypes
}
override fun writeTo(
value: Any,
type: Class<*>,
genericType: Type,
annotations: Array?,
mediaType: MediaType,
httpHeaders: MultivaluedMap,
entityStream: OutputStream
) {
val string = format.stringify(serializerByTypeToken(genericType), value)
val charset = try {
mediaType.parameters["charset"]?.let(Charset::forName)
} catch (e: RuntimeException) {
null
} ?: Charsets.UTF_8
entityStream.write(string.toByteArray(charset))
}
}
private class BinaryFormatMessageBodyWriter(
private val format: BinaryFormat,
private val mediaTypes: Set
) : MessageBodyWriter {
override fun isWriteable(
type: Class<*>,
genericType: Type,
annotations: Array?,
mediaType: MediaType
): Boolean {
return mediaType in mediaTypes
}
override fun writeTo(
value: Any,
type: Class<*>,
genericType: Type,
annotations: Array?,
mediaType: MediaType,
httpHeaders: MultivaluedMap,
entityStream: OutputStream
) {
val bytes = format.dump(serializerByTypeToken(genericType), value)
entityStream.write(bytes) // Not closing per parameter Javadoc.
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy