【发布时间】:2011-01-31 08:56:03
【问题描述】:
我正在使用 Flex 3 并通过 RemoteObject 调用 Java 1.6 方法,并通过 SecureAMFChannel 使用 BlazeDS 和 Spring 2.5.5 集成公开。 ActionScript 如下(此代码是在单独的开发网络上的真实事物的示例);
import com.adobe.cairngorm.business.ServiceLocator;
import mx.collections.ArrayCollection;
import mx.rpc.remoting.RemoteObject;
import mx.rpc.IResponder;
public class MyClass implements IResponder
{
private var service:RemoteObject = ServiceLocator.getInstance().getRemoteOjbect("mySerivce");
public MyClass()
{
[ArrayElementType("Number")]
private var myArray:ArrayCollection;
var id1:Number = 1;
var id2:Number = 2;
var id3:Number = 3;
myArray = new ArrayCollection([id1, id2, id3]);
getData(myArray);
}
public function getData(myArrayParam:ArrayCollection):void
{
var token:AsyncToken = service.getData(myArrayParam);
token.addResponder(this.responder); //Assume responder implementation method exists and works
}
}
一旦创建了通过 BlazeDS 公开的服务 Java 类,这将进行调用(假设机制工作,因为它们适用于不涉及 Collection 参数的所有其他调用)。我的 Java 服务类如下所示;
public class MySerivce {
public Collection<DataObjectPOJO> getData(Collection<Long> myArrayParam) {
//The following line is never executed and throws an exception
for (Long l : myArrayParam) {
System.out.println(l);
}
}
}
抛出的异常是 ClassCastException,表示 java.lang.Integer 不能转换为 java.lang.Long。我通过使用 Object 循环遍历集合来解决此问题,检查它是否为整数,将其转换为一个,然后对其执行 .longValue(),然后将其添加到临时 ArraList。呵呵。
最大的问题是我的应用程序应该处理来自数据库的数十亿条记录,而 id 将溢出整数的 21.47 亿限制。我希望在其中包含 BlazeDS 或 JavaAdapter,将 ActionScript Number 转换为方法中指定的 Long。我讨厌即使我使用泛型,集合的基础元素类型也是整数。如果这是纯 Java,则无法编译。
任何想法都值得赞赏。解决方案更好! :)
【问题讨论】:
标签: java apache-flex actionscript collections blazeds