Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin JacksonSerializer不';我不在科特林·兰姆达工作_Kotlin_Jackson_Aws Lambda - Fatal编程技术网

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中提供的
范围。这些都是版本不同步的容易地方。

我猜您将处理程序函数设置为kotlin
suspend
函数?如果是这样,那就是你的问题

当您标记一个函数
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函数-它可以防止您遇到类似这样的问题。请参阅以了解如何操作。

我猜您将处理程序函数设置为kotlin
suspend
函数?如果是这样,那就是你的问题

当您标记一个函数
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函数-它可以防止您遇到类似这样的问题。看看如何做