You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Telegram Bot反序列化报错:ID超出Int范围,如何改为Long类型?

解决Telegram Bot反序列化时ID超出int范围的问题

报错信息

org.telegram.telegrambots.meta.exceptions.TelegramApiRequestException: Unable to deserialize response
    Caused by: com.fasterxml.jackson.databind.JsonMappingException: Numeric value (5971126049) out of range of int (-2147483648 - 2147483647)
 at [Source: (String)"{"ok":true,"result":{"message_id":268,"from":{"id":5971126049,"is_bot":true,"first_name":"some","username":"some_bot"},"chat":...

用户问题

(类似问题的解决方案未能解决我的问题)您好!我在开发Telegram Bot时尝试获取响应message,但收到报错提示我的机器人ID无法序列化,原因是该ID应为long类型。请问我该如何修改?修改位置在哪里?非常感谢!

用户代码

SendMessage sendMessage = new SendMessage();
Message message = null;
if(update.getMessage().getText().equals("/start")) {
    /*
    List<String> initCategories = dataCategories.getInitCategories();
    ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup();
    List <KeyboardRow> keyboardRowList = new ArrayList<>();
    KeyboardRow row;
    for(String ic: initCategories){
        row=new KeyboardRow();
        row.add(ic);
        keyboardRowList.add(row);
    }
    replyKeyboardMarkup.setKeyboard(keyboardRowList);
    sendMessage.setReplyMarkup(replyKeyboardMarkup);
    */
    sendMessage.setText("Hola "+ update.getMessage().getFrom().getFirstName() + " 🙋‍♂️,\n\n" + welcomemessage);

    try {
        sendMessage.setChatId(update.getMessage().getChatId().toString());
        message = execute(sendMessage);
    } catch (TelegramApiException e) {
      e.printStackTrace();
    }
}
return message;
}

解决方案

这个报错的核心原因是Telegram返回的机器人ID(5971126049)数值超过了Java int类型的最大值(2147483647),而旧版本的telegrambots依赖库在反序列化时错误地用int类型接收这个ID。

1. 优先升级telegrambots依赖版本

新版本的库已经把User、Chat等类的id字段改为Long类型,直接升级就能解决问题:

  • Maven项目修改pom.xml:
    <dependency>
        <groupId>org.telegram</groupId>
        <artifactId>telegrambots</artifactId>
        <version>6.9.7</version> <!-- 替换为最新稳定版 -->
    </dependency>
    
  • Gradle项目修改build.gradle:
    implementation 'org.telegram:telegrambots:6.9.7'
    

2. 代码适配调整

升级依赖后,注意代码中ID的处理:

  • 获取用户/聊天ID时,直接用Long类型接收,不要强制转int
  • 设置ChatId时,推荐直接传入Long类型,不需要转成字符串:
    sendMessage.setChatId(update.getMessage().getChatId()); // 替换原toString()的写法
    

3. 无法升级依赖的临时修复

如果暂时不能升级,可以自定义Jackson模块强制将ID反序列化为Long:

import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.deser.std.NumberDeserializers;
import java.lang.reflect.Field;

public class TelegramIdFixModule extends SimpleModule {
    public TelegramIdFixModule() {
        try {
            // 修复User类的id字段反序列化
            Field userIdField = org.telegram.telegrambots.meta.api.objects.User.class.getDeclaredField("id");
            addDeserializer(userIdField.getType(), NumberDeserializers.LongDeserializer.instance);
            // 修复Chat类的id字段反序列化
            Field chatIdField = org.telegram.telegrambots.meta.api.objects.Chat.class.getDeclaredField("id");
            addDeserializer(chatIdField.getType(), NumberDeserializers.LongDeserializer.instance);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    }
}

然后在初始化Bot时注册这个模块:

TelegramBotsApi botsApi = new TelegramBotsApi(DefaultBotSession.class);
botsApi.getObjectMapper().registerModule(new TelegramIdFixModule());
botsApi.registerBot(yourBotInstance);

内容的提问来源于stack exchange,提问作者Carlos Noé

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 06:10:34