背景
我的系统上游通过RPC系统调用下游,在传递的时候使用Map<String, Object>进行参数传递。下游直接将Object取出进行强转,如下代码。
Long Value = (Long) request.getParams.get("longVlaueKey");
直接通过RPC调用接口执行的时候不会报错。下游系统是一个流程编排系统,在节点执行失败抛出异常的时候会根据配置进行失败重试。但是失败重试的时候就会报java.lang.Integer cannot be cast to java.lang.Long错误。
非常奇怪为什么会出现这种问题,通过日志定位到上面这段代码。失败重试的时候入参是通过JSON转化为对象的。这个时候params字段中的longVlaueKey是以int类型来存储的。在JAVA中int类型占用两个字节,long类型占用4个字节。将两个字节的变量强转成4个字节的变量,这明显是不符合要求的。
以上的问题可以通过下面这段代码复现
public class HelloWorld {
public static void main(String []args) {
String s = "{\"longValue\":123}";
JSONObject o = JSON.parseObject(s);
Long value = (Long)o.get("longValue");
}
}
但是为什么RPC调用的时候不会报错呢?如果有大佬知道的话可以交流一下。使用的RPC框架是Dubbo