AWS API Gateway - настройка шаблонов сопоставления запросов на интеграцию для принятия тела String, а не JSON - PullRequest
0 голосов
/ 21 марта 2019

У меня есть приложение весенней загрузки с методом GET, как показано ниже. Этот метод имеет входной параметр в виде строки, который сопоставляется с переменной пути {userId}.

@GetMapping("/users/{userId}")
public String get(@PathVariable ("userId") String userId) {
        return userId;
}   

Я создал лямбда-функцию AWS и загрузил JAR для весенней загрузки. Я могу проверить лямбда-функцию с тестовым событием после передачи строкового примера "userId1". Лямбда-функция работала нормально.

Использование API-шлюза, созданного API, определенного ресурса и метода GET. URL выглядит следующим образом:

/users/{userId} - GET - Integration Request  

Кроме того, следуйте приведенным ниже инструкциям для определения шаблонов отображения.

  1. Открыты параметры запроса на интеграцию, а затем шаблоны сопоставления тела.
  2. Выбран параметр: если шаблоны не определены (рекомендуется)
  3. Добавлен шаблон сопоставления для: application / json
  4. Добавлен следующий шаблон для сопоставления userId с входом Lambda

    { "userId": "$ input.params ('userId')" }

Когда я тестирую мой API, он дает мне исключение ниже. Я не уверен, как мне определить Mapping Templates, чтобы он принимал только String, а не JSON. Потому что моя лямбда-функция и соответствующий реализованный метод принимает только строку. Заранее спасибо за помощь.

{
  "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: lambdainternal.util.NativeMemoryAsInputStream@69b2283a; 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: lambdainternal.util.NativeMemoryAsInputStream@69b2283a; 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:857)",
        "com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:62)",
        "com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)",
        "com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:1511)",
        "com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1102)"
      ]
    }
  }
}

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

Моя проблема решается простым изменением. Как я уже упоминал в моем вышеупомянутом вопросе, я следовал за шагами ниже.

  1. Открыты настройки запроса на интеграцию, а затем шаблоны сопоставления тела.
  2. Выбран вариант: если шаблоны не определены (рекомендуется)
  3. Добавлен шаблон сопоставления для: application / json
  4. Добавлен следующий шаблон для сопоставления идентификатора пользователя с лямбда-входом

    {"userId": "$ input.params ('userId')"}

На последнем шаге # 4 я заменил формат JSON ниже на формат String.

 { "userId": "$input.params('userId')" }

С ниже, это работало. Мой API мог правильно передать параметр String моей лямбда-функции, которая имеет метод-обработчик с одним входом типа String.

 $input.params('userId')
0 голосов
/ 21 марта 2019

Я думаю, что ваша проблема произошла, потому что вы отображаете JSON, как:

{
    "key1": "value1",
    "key2": "value2",
    "key3": "value3",
    "key4": {
        "sub_key1": "value4"
    }
}

Содержит ключ key4 с объектом JSON в качестве значения. Когда вы пытаетесь десериализовать этот элемент, он не будет работать напрямую, потому что видит JSON_OBJECT, а не строку.

Вам нужно создать класс, подобный следующему:

public class Name { // the name doesn't matter 
    @JsonProperty("sub_key1")
    private String sub_key1;
    // getter and setter
}

чтобы решить вашу проблему.

...