ActionScript / Flex ArrayCollection объектов Number в Java Collection <Long>с использованием BlazeDS - PullRequest
0 голосов
/ 24 марта 2010

Я использую Flex 3 и выполняю вызов через RemoteObject для метода Java 1.6 и предоставляется с помощью BlazeDS и Spring 2.5.5 Интеграция через SecureAMFChannel. 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
    }

}

Это вызовет, когда-то созданный сервисному классу Java, который предоставляется через BlazeDS (предположим, что механика работает, потому что он работает для всех других вызовов, не связанных с параметрами 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, проверяя, является ли это Integer, приводил его к одному, затем выполнял .longValue (), а затем добавлял его в временный ArraList. Юк.

Большая проблема заключается в том, что мое приложение должно обрабатывать миллиарды записей из БД, а идентификатор переполняет целое число в 2,147 миллиарда. Я хотел бы иметь BlazeDS или JavaAdapter в нем, перевести номер ActionScript в Long, как указано в методе. Я ненавижу, что, хотя я использую универсальный, базовый тип элемента коллекции - целое число. Если бы это была прямая Java, она не скомпилировалась бы.

Любые идеи приветствуются. Решения еще лучше! :)

Ответы [ 3 ]

1 голос
/ 25 марта 2010

Пожалуйста, прочитайте следующие темы, связанные с вашей проблемой. Вы можете найти там некоторые обходные пути.

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

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

0 голосов
/ 07 января 2015

Flex сериализует ArrayCollection из Number s в ArrayCollection<Integer> в Java.

Поскольку Adobe ArrayCollection расширяет ArrayList, вы можете запустить Collection с помощью следующей функции. Это должно привести к List из Long значений.

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(); }));}
0 голосов
/ 21 сентября 2010

Вы также можете изменить аргумент на стороне Java, чтобы ожидать Long[], а не Collection<Long>. Поскольку нативный массив Java строго типизирован, он правильно десериализуется.

...