Kotlin JacksonSerializer不';我不在科特林·兰姆达工作
当我使用Kotlin JacksonSerializer不';我不在科特林·兰姆达工作,kotlin,jackson,aws-lambda,Kotlin,Jackson,Aws Lambda,当我使用JacksonSerializer()功能创建一个客户端并进行一些API调用,然后在本地机器上运行该脚本时,没有出现错误,脚本运行成功。但是,当我将此脚本作为AWS Lambda上载时,会出现以下错误: com.fasterxml.jackson.databind.JsonMappingException:无法构造kotlin.coroutines.Continuation的实例,问题:抽象类型要么需要映射到具体类型,要么需要自定义反序列化程序,要么需要使用其他类型信息进行实例化 起初
JacksonSerializer()
功能创建一个客户端并进行一些API调用,然后在本地机器上运行该脚本时,没有出现错误,脚本运行成功。但是,当我将此脚本作为AWS Lambda上载时,会出现以下错误:
com.fasterxml.jackson.databind.JsonMappingException:无法构造kotlin.coroutines.Continuation的实例,问题:抽象类型要么需要映射到具体类型,要么需要自定义反序列化程序,要么需要使用其他类型信息进行实例化
起初,我认为错误源于我在处理程序
类外部构造客户机,但当我在处理程序
类内部将客户机设为私有值时,我仍然得到错误。我在函数中包含了println()
语句,但它们甚至不运行。这说明我的handleRequest()
函数没有运行。是否有一些AWS/Lambda'ism阻止我将JacksonSerializer()
功能用作?如果是这样的话,在如何使用Ktor客户端解析JSON响应方面是否有其他选择
我的客户建设:
private val client = HttpClient(Apache) {
install(JsonFeature) {
serializer = JacksonSerializer()
}
}
使用客户端的调用示例:
val response = client.post<JsonNode> {
url(URL(GITHUB_GRAPHQL_ENDPOINT))
body = reqBody
headers {
append("Authorization", "bearer $token")
}
}
val response=client.post{
url(url(GITHUB_GRAPHQL_端点))
body=reqBody
标题{
附加(“授权”、“持票人$token”)
}
}
您是否检查了本地运行的依赖项与AWS中的依赖项?我在本地使用一个版本运行时遇到了一些问题,但是AWS中的版本不同。这可以特别解释关于延续的错误。。。也许方法签名在您使用的任何版本中都是不同的
特别要注意gradle/maven pom中提供的
范围。这些都是版本不同步的容易地方。您检查过本地运行的依赖项与AWS中的依赖项了吗?我在本地使用一个版本运行时遇到了一些问题,但是AWS中的版本不同。这可以特别解释关于延续的错误。。。也许方法签名在您使用的任何版本中都是不同的
特别要注意gradle/maven pom中提供的范围。这些都是版本不同步的容易地方。我猜您将处理程序函数设置为kotlinsuspend
函数?如果是这样,那就是你的问题
当您标记一个函数suspend
时,编译器会应用一系列的魔法。大多数情况下,除了任何suspend
函数都会在其签名中添加一个类型为kotlin.coroutines.Continuation
的额外参数之外,您不需要知道任何关于这一点的信息。您通常不会注意到这一点,因为编译器也会通过自己的隐藏Continuation
参数调用函数
Continuation
,从设计上讲,像Jackson这样的工具是无法创建的——这是一个内在的东西。您可能需要做的(假设您确实使处理程序函数suspend
)是将您的方法包装在runBlocking{}
中,并使其不是suspend
函数。创建新的处理程序可能是最简单的,如下所示:
fun fixedHandler(input: MyInput, context: Context) = runBlocking {
originalHandler(input, context)
}
suspend fun originalHandler(input: MyInput, context: Context): MyOutput {
TODO("This is your original code")
}
PS-我通常发现最好利用预定义的Lambda接口来编写Lambda函数-它可以防止您遇到类似这样的问题。请参阅以了解如何操作。我猜您将处理程序函数设置为kotlinsuspend
函数?如果是这样,那就是你的问题
当您标记一个函数suspend
时,编译器会应用一系列的魔法。大多数情况下,除了任何suspend
函数都会在其签名中添加一个类型为kotlin.coroutines.Continuation
的额外参数之外,您不需要知道任何关于这一点的信息。您通常不会注意到这一点,因为编译器也会通过自己的隐藏Continuation
参数调用函数
Continuation
,从设计上讲,像Jackson这样的工具是无法创建的——这是一个内在的东西。您可能需要做的(假设您确实使处理程序函数suspend
)是将您的方法包装在runBlocking{}
中,并使其不是suspend
函数。创建新的处理程序可能是最简单的,如下所示:
fun fixedHandler(input: MyInput, context: Context) = runBlocking {
originalHandler(input, context)
}
suspend fun originalHandler(input: MyInput, context: Context): MyOutput {
TODO("This is your original code")
}
PS-我通常发现最好利用预定义的Lambda接口来编写Lambda函数-它可以防止您遇到类似这样的问题。看看如何做