【问题标题】:ActionScript/Flex ArrayCollection of Number objects to Java Collection<Long> using BlazeDS使用 BlazeDS 将 Number 对象的 ActionScript/Flex ArrayCollection 转换为 Java Collection<Long>
【发布时间】: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


    【解决方案1】:

    Flex 在 Java 中将 ArrayCollectionNumbers 序列化为 ArrayCollection&lt;Integer&gt;

    由于 Adob​​e 的ArrayCollection 扩展 ArrayList,您可以通过以下函数运行Collection。这应该会产生 ListLong 值。

    public class TransformUtils {
      public static final <T extends Number> List<Long> toLongList(Collection<T> values) {
        List<Long> list = new ArrayList();
        for (T value : values) {
          list.add(value.longValue());
        }
        return list;
      }
    }
    
    public class MySerivce {
      public Collection<DataObjectPOJO> getData(Collection<Long> myArrayParam) {
        myArrayParam = TransformUtils.toLongList(myArrayParam);
        for (Long l : myArrayParam) {
          System.out.println(l);
        }
      }
    }
    

    番石榴:)

    public static final <T extends Number> List<Long> toLongList(Collection<T> values) {
      return Lists.newArrayList(new Function<T, Long>() {
        @Override public Long apply(T value) {
          return value.longValue(); }));}
    

    【讨论】:

      【解决方案2】:

      您还可以更改 Java 端的参数以期望 Long[] 而不是 Collection&lt;Long&gt;。因为原生 Java 数组是强类型的,所以它可以正确反序列化。

      【讨论】:

        【解决方案3】:

        请阅读以下与您的问题相关的主题。您可以找到一些解决方法。

        https://bugs.adobe.com/jira/browse/BLZ-115

        https://bugs.adobe.com/jira/browse/BLZ-305

        【讨论】:

        • +1 用于正确识别问题 + 提供官方参考/解决方法
        最近更新 更多