将 int 从 flex 传回 java 时遇到问题。有问题的 int 是一个 ID,今天早上我似乎已经达到了阈值,因为事情开始崩溃。
我在flex中通过blaze传回922927950到java。当java获取时它已经转换为9.2292795E8
我在flex中的代码是
service.getRemoteObject().sendData(objectIds);
其中对象 ids 是 ArrayCollection。在这里我可以调试并看到数字是 922927950。然后我可以调试 java 并看到它已转换为 9.2292795E8
sendData 具有以下签名
public void sendData(List<Integer> objectIds) {...}
我尝试更改 flex objectids 数组以包含数字而不是整数,但这也不起作用。据我所知,在java中要存储9.2292795E8,该数字必须是 float 。 float 确实适合java中的整数,所以我想这就是为什么我没有收到类型不匹配错误的原因。问题是 id 现在采用科学记数法,这会破坏使用它们的 jpa 查询。
有谁知道为什么数字要转换成科学记数法吗?
谢谢
更新
经过更多调查后,情况变得更加奇怪。我在我的java中尝试了以下代码
public void sendData(List<Integer> objectIds) {
List<Integer> converted = new ArrayList<Integer>();
for (Integer objectId : objectIds) {
converted.add(objectId);
}
...
}
我现在收到类转换异常,说我无法在 conversion.add(objectId) 行上将 double 转换为整数
java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.Integer
当我在 Flex 中将 922927950 转换为 Number(我认为它映射到 Double)时,就会发生这种情况。我的问题是我在 java 端使用泛型而 BlazeDs 不考虑这些,所以只匹配签名而没有泛型?
最佳答案
首先,看Amf3Types documentation :
The maximum value for an int that will avoid promotion to an ActionScript Number when sent via AMF 3 is 2^28 - 1, or 0x0FFFFFFF
十进制表示为 268,435,455,而 922,927,950 远远超出了此限制。请注意,这是一个序列化问题:int data type能够保存 2^31 - 1 值,就像常规的 32 位 int 类型一样。
现在,您应该用您的代码尝试一下:
public void sendData(List<?> objectIds) {
List<Integer> converted = new ArrayList<Integer>();
for (Object objectId : objectIds) {
converted.add(((Number)objectId).intValue());
}
...
}
如果您需要更好地控制类型转换和高级数字类型,您应该考虑使用 GraniteDS而不是 BlazeDS。请参阅文档 here和 here .
问候, 弗兰克。
关于java - BlazeD 在将数据从 flex 传递到 java 时将 int 转换为 float,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12214672/