JacksonSerializer не работает в Kotlin Lambda - PullRequest
0 голосов
/ 01 мая 2019

Когда я создаю клиента с функцией JacksonSerializer() и выполняю некоторые вызовы API, а затем запускаю этот скрипт на моем локальном компьютере, я не получаю ошибок, и скрипт успешно выполняется.Однако, когда я загружаю этот скрипт как AWS Lambda, я получаю следующую ошибку:

com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of kotlin.coroutines.Continuation, problem: abstract types either need to be mapped to concrete types, have custom deserializer, or be instantiated with additional type information

Сначала я думал, что ошибка возникла из-за того, что я создал клиент вне класса Handler, но когдаЯ сделал клиент частным значением внутри класса Handler, но я все еще получаю сообщение об ошибке.Я включил println() операторов в свою функцию, но они даже не запускаются.Это говорит мне, что мой handleRequest() функционал не запускается.Есть ли какой-то AWS / Lambda'ism, который мешает мне использовать функцию JacksonSerializer() как?Если да, есть ли какие-либо альтернативы для анализа ответов JSON с клиентом Ktor?

Конструкция моего клиента:

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")
    }
}

Ответы [ 2 ]

1 голос
/ 01 мая 2019

Я предполагаю, что вы сделали свою функцию обработчика функцией kotlin suspend?Если так, то это ваша проблема.

Когда вы помечаете функцию suspend, компилятор применяет кучу магии.В большинстве случаев вам не нужно ничего знать об этом, кроме того факта, что любая функция suspend получает дополнительный параметр типа kotlin.coroutines.Continuation, добавленный к ее сигнатуре.Обычно вы этого не замечаете, поскольку компилятор также делает вызовы функции передающими свой скрытый параметр Continuation.

Continuation, по замыслу, не может быть создан таким инструментом, как Джексон- это внутренняя вещь.Что вам, вероятно, нужно сделать (при условии, что вы сделали функцию-обработчик 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 - это предотвращает возникновение проблемкак это.См. https://docs.aws.amazon.com/lambda/latest/dg/java-handler-using-predefined-interfaces.html, как это сделать.

1 голос
/ 01 мая 2019

Проверяли ли вы свои зависимости, работающие локально, по сравнению с вашими зависимостями в AWS? У меня были проблемы, когда локально я работаю с версией, но версия в AWS была другой. Это может, в частности, объяснить ошибку о продолжениях ... Возможно, сигнатура метода отличается в той версии, которую вы используете?

Ищите специально для provided прицелов в помпе грейд / мавен. Это простые места для несогласованности версий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...