2010-03-24 1 views
0

Flex 3을 사용하여 RemoteObject를 통해 Java 1.6 메소드를 호출하고 SecureAMFChannel에서 BlazeDS 및 Spring 2.5.5 통합과 함께 노출됩니다. ActionScript는 다음과 같습니다 (이 코드는 별도의 dev 네트워크에있는 실제 예제입니다). Number 객체와 Java Collection의 콜렉션 <Long> BlazeDS를 사용합니다.

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 
    } 

} 

번 (그들은 컬렉션 매개 변수를 포함하는 모든 다른 통화 할 수 있기 때문에 기계가 작동 가정) 블레이즈 DS를 통해 노출되는 서비스를 자바 클래스로 생성 된 호출을 만들 것입니다. 내 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); 
     } 
    } 

} 

throw되는 예외는 java.lang.Integer에이 java.lang.Long의 캐스팅 될 수 없다는는 ClassCastException이다. 나는이 문제를 해결하기 위해 Object를 사용하여 컬렉션을 반복하고 Integer인지 확인하고 하나에 캐스팅 한 다음 .longValue()를 수행하여 임시 ArraList에 추가합니다. 수다.

큰 문제는 내 응용 프로그램이 DB에서 수십억의 레코드를 처리해야하고 ID가 정수의 2147 억 제한을 오버플로한다는 것입니다. BlazeDS 또는 JavaAdapter를 사용하고 ActionScript 번호를 메서드에 지정된 Long으로 변환하고 싶습니다. 제네릭을 사용하더라도 컬렉션의 기본 요소 유형은 정수입니다. 이것이 곧바로 Java라면, 컴파일되지 않을 것입니다.

모든 아이디어는 높이 평가됩니다. 솔루션이 더 좋습니다! :)

답변

0

는 또한 Long[] 오히려 Collection<Long> (A)보다 기대하는 자바 측에서 인수를 변경할 수 있습니다. 네이티브 Java 배열은 강력한 형식이므로 올바르게 직렬화되지 않습니다.

0

플렉스는 ArrayCollectionNumber을 Java의 ArrayCollection<Integer>으로 직렬화합니다. Adobe의 ArrayCollectionArrayList를 확장

때문에, 당신은 다음과 같은 기능을 통해 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(); }));} 
관련 문제