Я использую 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, она бы не компилировалась.
Любые идеи приветствуются. Решения еще лучше! :)