Java实现JSON RPC系统调用时NumberFormatException报错排查
问题根因
报错本质是JSON反序列化阶段的类型不匹配:Info实体类中将version字段定义为long数值类型,但上游RPC接口返回的version是带字母、标点的字符串(v2.6.5.2: Beta 2.6.5.2),JSON序列化框架无法将该字符串自动转为long类型,因此抛出NumberFormatException,进而触发上层的BitcoindConnector4JException。
修复方案
核心修改点是将version字段的类型调整为和上游返回一致的字符串型,具体操作如下:
- 修改
Info.java中version字段的类型定义、对应的getter和setter方法:
// 替换原有version相关的代码 private String version; public String getVersion() { return version; } public void setVersion(String version) { this.version = version; }
- 验证业务逻辑:你当前在
SperoCoin.java中直接将info.getVersion()的结果拼接进HTML页面,字段改为String类型后不需要额外修改拼接逻辑,即可正常展示完整的版本字符串。 - 可选扩展:如果后续业务需要用版本号做大小比较,可以新增工具方法提取纯数值版本:
// 新增到Info类中 public long getNumericVersion() { if (version == null || version.isBlank()) { return 0L; } try { // 提取冒号前的版本段,去掉前缀v String numPart = version.split(":")[0].replace("v", "").trim(); String[] segments = numPart.split("\\."); long numericVer = 0; for (String seg : segments) { numericVer = numericVer * 1000 + Integer.parseInt(seg); } return numericVer; } catch (Exception e) { e.printStackTrace(); return 0L; } }
- 额外注意:对照上游返回的JSON结构,
difficulty字段是对象类型,但你当前在Info类中定义为Double,后续调用getDifficulty()时也会触发类型错误,建议同步修改difficulty为对应的自定义实体类,或者改为Object/JsonNode类型适配。
内容的提问来源于stack exchange,提问作者Spero Coin
相关产品推荐
相关产品推荐

