Telegram API - InlineKeyboardMarkup не отображается

Рейтинг: -1Ответов: 1Опубликовано: 21.04.2023

Пишу pet проект для заказа еды в кафе. По задумке после /start пользователю выдается меню в виде InlineKeyboardMarkup, затем обрабатываю нажатия на кнопки.

public InlineKeyboardMarkup createMenuKeyboard() {
        InlineKeyboardMarkup keyboard = new InlineKeyboardMarkup();
        keyboard.addRow(new InlineKeyboardButton("Пицца").callbackData("pizza"));
        keyboard.addRow(new InlineKeyboardButton("Суши").callbackData("sushi"));
        keyboard.addRow(new InlineKeyboardButton("Бургеры").callbackData("burger"));
        keyboard.addRow(new InlineKeyboardButton("Салаты").callbackData("salad"));
        return keyboard;
    }
clientBot.execute(new SendMessage(clientId, botMessage).replyMarkup(createMenuKeyboard()));
        if (update.callbackQuery() != null) {
            String data = update.callbackQuery().data();
            clientId = update.callbackQuery().message().chat().id();
            if (data.equals("pizza")) {
               clientBot.execute(menuService.sendFoodMenu(clientId, FoodType.PIZZA));
            }
        }

В ответ пользователь должен получить список кнопок с названиями блюд. Проблема в том что не отрисовывают кнопки после обработки.

Делаю запрос в БД в зависимости от типа которым подписана кнопка.

        Class<? extends Food> foodClass = foodType.getFoodClass();
        ResolvableType resolvableType = ResolvableType.forClassWithGenerics(FoodRepository.class, foodClass, Long.class);
        FoodRepository<? extends Food, Long> foodRepository =
                (FoodRepository<? extends Food, Long>) applicationContext.getBeanProvider(resolvableType).getObject();
        List<? extends Food> foods = foodRepository.findAll();
        List<InlineKeyboardButton> inlineKeyboardButtons = new ArrayList<>();
        for (Food food : foods) {
            inlineKeyboardButtons.add(food.getButtons());
        }
        return inlineKeyboardButtons;
    }

Создаю кнопку в классе блюда.

@Override
    public InlineKeyboardButton getButtons() {
        return new InlineKeyboardButton(getName());
    }

И отправляю ответ пользователю. Если не прикреплять InlineKeyboardMarkup к ответу, то ответ в чат приходит, с ним же ничего. Ошибок в логах нет.

        List<InlineKeyboardButton> buttons = getButton(foodType);
        InlineKeyboardMarkup keyboard =
                new InlineKeyboardMarkup();
        for (InlineKeyboardButton button : buttons) {
            keyboard.addRow(button);
        }
       return new SendMessage(chatId, "Выберите " + foodType.name().toLowerCase() + " из меню:").replyMarkup(keyboard);
    }

Ответы

▲ 1Принят

В соответствии с документацией, у объекта InlineKeyboardButton поле text обязательное. Но кроме этого, вы должны задать ровно одно из опциональных полей.

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