Подтвердить что ты не робот

Ошибка выполнения "Hello World" для AWS Lambda в Java

Я написал следующий Hello World Lambda, который я выполняю, загружая AWS с помощью инструментария AWS для Eclipse.

public class HelloWorldLambdaHandler implements RequestHandler<String, String> {
    public String handleRequest(String input, Context context) {
        System.out.println("Hello World! executed with input: " + input);
        return input;
    }
}

При выполнении кода выше возникает следующая ошибка. Любая идея, что я, возможно, делаю неправильно здесь? Проект BTW Maven, у которого есть этот обработчик, не имеет другого класса, и только зависимость - это aws-lambda-java-core версия 1.1.0.

Skip uploading function code since no local change is found...
Invoking function...
==================== FUNCTION OUTPUT ====================
{"errorMessage":"An error occurred during JSON parsing","errorType":"java.lang.RuntimeException","stackTrace":[],"cause":{"errorMessage":"com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token\n at [Source: [email protected]; line: 1, column: 1]","errorType":"java.io.UncheckedIOException","stackTrace":[],"cause":{"errorMessage":"Can not deserialize instance of java.lang.String out of START_OBJECT token\n at [Source: [email protected]; line: 1, column: 1]","errorType":"com.fasterxml.jackson.databind.JsonMappingException","stackTrace":["com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)","com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:835)","com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:59)","com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:12)","com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:1441)","com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1047)"]}}}
4b9b3361

Ответ 1

По какой-то причине Amazon не может десериализовать json для String. Вы могли бы подумать, что String будет таким же общим, как входной параметр, поскольку вы можете получить, но правильно или неправильно, что он несовместим.

Для обработки JSON вы можете использовать карту или пользовательскую POJO.

public class HelloWorldLambdaHandler {
    public String handleRequest(Map<String,Object> input, Context context) {
        System.out.println(input);
        return "Hello";
    }
}

Ответ 2

Прочитайте ошибку из трассировки стека. В нем говорится: "Невозможно десериализовать экземпляр java.lang.String из токена START_OBJECT". Тоном "START_OBJECT" является "{".

Проблема заключалась в том, что вам нужно передать фактическую строку в качестве входного сигнала, например, "A String". Это ваш json-вход. Не {}. {} не является строкой. Вам не нужны фигурные скобки, просто строка (в кавычках). С другой стороны, {} является допустимым объектом Person, поэтому он работал после того, как вы изменили его, чтобы обрабатывать Person как вход.

Ответ 3

Я пробовал со следующим значением в тесте:

"TestInput"

вместо:

{ Input : "TestInput"}

и, похоже, сработало нормально.

Ответ 4

Полное рабочее решение

public class HelloWorldLambdaHandler implements RequestHandler<String, String> {
    public String handleRequest(String input, Context context) {
        System.out.println("Hello World! executed with input: " + input);
        return input;
    }
}

тогда ввод должен быть в двойных кавычках в виде строки - "Тестовый ввод"

Ответ 5

Окно ввода для тестового конфигуратора принимает необработанные json или строки.

  • Если вы передадите raw json, AWS преобразует json в Map, где имена переменных являются ключами, отображающими соответствующие значения.
  • Если вы заключите json в двойные кавычки и разграничите внутренние кавычки, это приемлемое строковое представление Java-объекта json и может быть проанализировано как обычно.