用 Javalin 框架中的 kotlinx.serialization 替换 Jackson

Posted

技术标签:

【中文标题】用 Javalin 框架中的 kotlinx.serialization 替换 Jackson【英文标题】:Replace Jackson with kotlinx.serialization in Javalin framework 【发布时间】:2021-01-24 19:32:00 【问题描述】:

我正在尝试用 Kotlinx.serialization 替换默认的 Javalin JSON 序列化程序 Jackson。

文档显示了如何做到这一点with GSON serializer。 不幸的是,kotlinx 序列化程序具有不同的函数签名,我无法弄清楚如何传递参数。

序列化是可以的,但使用 decodeFromString 函数的反序列化需要传递映射函数给定的类型 targetClass

我被困在这里:

val kotlinx = Json  coerceInputValues = true 
    
JavalinJson.toJsonMapper = object : ToJsonMapper 
    override fun map(obj: Any): String = kotlinx.encodeToString(obj)

    
JavalinJson.fromJsonMapper = object : FromJsonMapper 
    override fun <T> map(json: String, targetClass: Class<T>): T = kotlinx.decodeFromString(json)

但我得到:Cannot use 'T' as reified type parameter. Use a class instead.

我也试过了:

JavalinJson.fromJsonMapper = object : FromJsonMapper 
    override inline fun <reified T> map(json: String, targetClass: Class<T>): T = kotlinx.decodeFromString(json)

但我收到警告:Override by an inline function 和错误:Override by a function with reified type parameter

我是 kotlin 的新手,我很难理解这个覆盖有什么问题。

【问题讨论】:

【参考方案1】:

试试这个:

JavalinJson.toJsonMapper = object : ToJsonMapper 
    override fun map(obj: Any): String 
        val serializer = serializer(obj.javaClass)
        return kotlinx.encodeToString(serializer, obj)
    


JavalinJson.fromJsonMapper = object : FromJsonMapper 
    override fun <T> map(json: String, targetClass: Class<T>): T 
        @Suppress("UNCHECKED_CAST")
        val deserializer = serializer(targetClass) as KSerializer<T>
        return kotlinx.decodeFromString(deserializer, json)
    

【讨论】:

非常感谢,它看起来比以前好多了。不过,我总是遇到一些错误。 Serializer for class 'Any' is not found。问题是 serializer(targetClass) 返回的是 KSerializer&lt;Any&gt; 而不是 KSerializer&lt;T&gt; 我尝试了val deserializer: KSerializer&lt;T&gt; = serializer&lt;T&gt;(),这似乎更合适,但我又遇到了reified 问题.. 看来,这个错误与toJsonMapper有关。编辑答案,也添加了这个。 现在我得到这个错误:Serializer for class 'GenericResponse' is not found. Mark the class as @Serializable or provide the serializer explicitly 更好,因为GenericResponse 是我的序列化数据类。奇怪的是这个类已经被标记为Serializable 您确定在项目中添加了 Kotlin 序列化编译器插件吗?

以上是关于用 Javalin 框架中的 kotlinx.serialization 替换 Jackson的主要内容,如果未能解决你的问题,请参考以下文章

javalin实现restful接口并集成swagger设置header字段

javalin实现restful接口并集成swagger设置header字段

javalin实现restful接口并集成swagger设置header字段

javalin实现restful接口并集成swagger设置header字段

几个基于jvm 的微服务框架

UnitTest框架中的核心要素都有哪些?