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é
相关产品推荐
相关产品推荐

