ActionScript / Flex Array Коллекция числовых объектов для Java Collection ‹Long› с использованием BlazeDS

Я использую 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, проверяя, является ли она целым числом, приводя его к единице, затем выполняя для него .longValue (), а затем добавляя его во временный ArraList. Юк.

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

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


person Justin    schedule 24.03.2010    source источник


Ответы (3)


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

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

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

person Cornel Creanga    schedule 25.03.2010
comment
+1 за правильное определение проблемы + предоставление официальных ссылок / обходных путей - person Dennis Jaamann; 31.10.2011

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

person Markus    schedule 21.09.2010

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

Поскольку 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(); }));}
person Mr. Polywhirl    schedule 07.01.2015