Рубрики
Без рубрики

Совет по функциям Azure: понимание GSON JsonSyntaxException

Я работал над функциями Azure, используя триггер Azure Event Hubs, и появилась эта ошибка: Результат: F… Помеченный как бессерверный, azure, java, showdev.

Я работал над функциями Azure использование Azure Event Hubs срабатывает, и появляется эта ошибка:

Result: Failure
Exception: IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $
Stack: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:226)
    at com.google.gson.Gson.fromJson(Gson.java:927)
    at com.google.gson.Gson.fromJson(Gson.java:892)
    at com.google.gson.Gson.fromJson(Gson.java:841)

.... //omitted for brevity

Что может пойти не так?

TL;DR Пожалуйста, не забывайте использовать правильную мощность при использовании триггера EventHubs с функциями Azure , и если вы это сделаете, надеюсь, вы наткнетесь на этот пост в блоге если вы Погуглите это в Bing! 😉

(немного) более длинная версия…

Эта ошибка была для меня новой. При дальнейшем самоанализе я понял, что проблема была связана с тем, что платформа Azure Functions не могла вызвать сам метод функции (т.Е. Это не имело ничего общего с самой логикой функции).

Кстати, существует множество функций, упрощающих устранение неполадок в функциях Azure

Функции Azure используют библиотеку gson для сериализации/десериализации полезных нагрузок

Вот фрагмент метода:

@FunctionName("processData")
public void process(
    @EventHubTrigger(name = "event", eventHubName = "", connection = "EventHubConnectionString") 
    Data data, final ExecutionContext context) {
        //implementation
    }

В этом случае не удалось преобразовать полезную нагрузку EventHubs в Data POJO, который ожидал метод.

Я заглянул в Azure Functions Java API docs , чтобы подтвердить, правильно ли я использовал @EventHubTrigger . И я наткнулся на свойство мощность

Вот определение:

Мощность входного сигнала триггера. Выберите “Один”, если ввод представляет собой одно сообщение, или “Много”, если ввод представляет собой массив сообщений. ‘ Many’ – значение по умолчанию, если не указано .. и его значение по умолчанию равно Мощности. много

Момент ага! Теперь было не так уж сложно разобраться в сообщении об ошибке Ожидаемый BEGIN_OBJECT, но был BEGIN_ARRAY – из-за Мощности платформа пыталась сериализовать список/массив данных POJOS, но метод ожидал только один. Включая мощность явно ( Мощность. ОДИН ) был решением т.е.

@EventHubTrigger(
    name = "event", 
    eventHubName = "", 
    connection = "EventHubConnectionString",
    cardinality = Cardinality.ONE) 

Другой способ – изменить подпись на accept List и выбрать первый элемент в списке, например data.get(0)

На данный момент это все. Если вы нашли это полезным, покажите несколько ❤️ и следите за обновлениями, чтобы узнать больше 🙌 !

Оригинал: “https://dev.to/azure/azure-functions-tip-making-sense-of-gson-jsonsyntaxexception-5355”