2011-12-23 9 views
0



플렉스 : 실행될 때 나는 RobotLegs를 사용하여 Flex 어플리케이션을 개발하고 있어요

2 시간을 널 (null) AsyncToken 관련을 반환 LCDS 서비스, 라이브 사이클 DS & 자바. 나는 LCDS를 사용하여 업데이트 기능을 구현하기 위해 노력하고있어,하지만 난 이상한 행동을 실행 해요 :

이것은 RobotLegs 'execute 명령 내에서 ActionScript 코드입니다, 업데이트를 수행하는 데 사용 :

를 내가 업데이트 할 노력하고있어 model.currentRequestDetail
var token:AsyncToken = services.requestService.commit(new Array(model.currentRequestDetail)); 
responder = new AsyncResponder(resultHandler, faultHandler, token); 
if (token) token.addResponder(responder); 



는 RequestDetail 개체입니다 :

[Managed] 
[RemoteClass(alias="be.fgov.mobilit.td.lcds.vo.RequestDetail")] 
public class RequestDetail { 

    public var id:Number; 
    public var request:Request; 
    public var task:Task; 

    /** 
    * Constructor 
    */ 
    public function RequestDetail() { 
    } 
} 

처음으로 Actionscript 코드가 실행될 때 모든 것이 정상적으로 작동합니다. AsyncToken이 services.requestService.commit() 함수에 의해 올바르게 반환됩니다. resultHandler가 예상대로 실행되고 GUI에서 개체가 업데이트됩니다.
그러나이 코드가 두 번째 실행될 때 내 services.requestService.commit() 함수는 null 값을 반환하고 my resultHandler에는 결코 도달하지 않습니다. 자바 어셈블러에 도달하지 못했다고 생각합니다.

resultHandler(result:Object, token:Object = null) 
faultHandler(result:Object, token:Object = null) 
다음 faultHandler 오른쪽 서명이

var requestDetailService:DataService = new DataService("requestDetail"); 
requestDetailService.autoCommit = false; 



모두 resultHandler & :





내가 DataService에 선언하는 방법이다

<destination id="request"> 
    <properties> 
<source>be.fgov.mobilit.td.lcds.assemblers.RequestAssembler</source> 

     <scope>application</scope> 

     <metadata> 
      <identity property="id" /> 
      <identity property="task" /> 
     </metadata> 

     <server> 
      <get-method> 
       <name>getRequest</name> 
      </get-method> 
      <sync-method> 
       <name>syncRequest</name> 
      </sync-method> 
     </server> 
    </properties> 
</destination> 




:

package be.fgov.mobilit.td.lcds.assemblers; 
import java.util.Iterator; 
import java.util.List; 
import java.util.Map; 
import be.fgov.mobilit.td.lcds.vo.RequestDetail; 
import flex.data.ChangeObject; 
import flex.data.assemblers.AbstractAssembler; 

public class RequestAssembler extends AbstractAssembler { 

public RequestAssembler() { 
    // TODO Auto-generated constructor stub 
} 

public RequestDetail getRequest(Map<String, Object> identity) { 
    return ServiceUtility.getLcdsService().getRequestDetail(identity); 
} 

public List<ChangeObject> syncRequest(List<ChangeObject> changes) { 
    Iterator<ChangeObject> iterator = changes.iterator(); 
    ChangeObject co; 
    while (iterator.hasNext()) { 
     co = (ChangeObject) iterator.next(); 
     if (co.isUpdate()) { 
      co = doUpdate(co); 
     } 
    } 
    return changes; 
} 

private ChangeObject doUpdate(ChangeObject co) { 
    RequestDetail requestDetail = (RequestDetail) co.getNewVersion(); 
     co.setNewVersion(ServiceUtility.getLcdsService().updateRequestDetail(requestDetail)); 
    return co; 
} 
} 



이 어셈블러의 구성입니다 : 0

,이 코드 우리는 또한 사용자 정의 자바 어셈블러를 사용하고
입니다
긴 이야기 짧은 :
누구도 단서/경험을 가지고 있습니까? 두 번째로 services.requestService.commit(); 함수를 실행하면 null이 반환됩니다. Asynctoken?




미리!




요청, 나는 내 서비스 클래스에서 (제거) 코드를 추가했다.당신이 볼 수 있듯이 정말 특별한 아무 일도하지 :

package be.fgov.mobilit.services { 
import mx.data.DataService; 
import mx.messaging.Consumer; 
import mx.messaging.events.MessageEvent; 
import mx.rpc.http.HTTPService; 

public class LiveCycleServices { 

    public var requestService:DataService; 

    public function LiveCycleServices() {   

     requestService = new DataService("request"); 
     requestService.autoCommit = false; 
    } 


    /** 
    * @param MessageEvent The event object that is dispatched by the Flex framework 
    * @return void 
    * 
    * This message captures the server push messages that need to trigger an update 
    * of the task list, since this is specific for every client and cannot be 
    * determined on the server side, coming from LiveCycle. 
    */ 
    private function messageHandler(event:MessageEvent):void { 
     taskListService.refresh();   
    } 
} 
} 



이 내에서 그 결과 & faulthandlers가 추가되는 chode입니다 :

var token:AsyncToken = services.requestService.commit(new Array(model.currentRequestDetail)); 
var responder:AsyncResponder = new AsyncResponder(resultHandler, faultHandler, token); 
if (token) token.addResponder(responder); 
+0

서비스 클래스 및/또는 requestEservices 객체의 코드는 무엇입니까? 언급 된 방식은 뭔가 솜씨가 있습니다. 적어도 Demeter의 법칙을 위반하는 것은 아닙니다.하지만 거기에서도 정적 방법을 사용하고 있습니다. Robotleg를 사용하는 경우에는 절대 수행 할 이유가 없습니다. –

+0

안녕하세요 @AmyBlankenship, 시간을내어 읽고 답장을 보내 주셔서 감사합니다. 원래 게시물 끝에 서비스 클래스의 코드를 추가했습니다. 사전에 – WWWillems

+0

결과 및 오류 메소드가 추가 된 코드를 추가 할 수 있습니까? 대부분의 경우 (LCDS를 포함하지 않음) 결과 W 결함 핸들러는 단일 매개 변수 인 이벤트 만 갖 고 비동기 토큰은 해당 이벤트의 특성입니다. 이전에 LCDS를 사용하지 않았기 때문에 현재 진행중인 작업을 정확히 파악해야합니다. –

답변

0

WWW를,이 ISN ' 정말 그럴듯한 답변이지만, 나는 코멘트가 줄 것보다 더 많은 공간이 필요하다. 그러나, 나는 당신의 모든 코드가 당신에게 좋은 대답을주기에 충분히 잘 연결되어있는 것을 보지 못하고있다.

일반적으로 결과 및 결함 서명은 이 아니며은 "올바른"서명으로 묘사 된 것과 유사해야합니다. AsyncToken은 오류 및 결과 지침에 단일 매개 변수가있는 IResponder를 Object로 기대합니다. 일반적으로 이것은 fault 또는 result 이벤트 (적절한 경우)와 함께 호출됩니다.

이제 나는 순수하게 이론적 인 영토로 갈 것입니다. 연결이 열려 있기 때문에 DataService 클래스는 단 하나의 AsyncToken을 만들 수 있습니다. 이 경우 오류가있는 메서드 서명이 해당 메서드에서 사용하기 위해 반환 할 수없는 정도까지 AsyncToken을 손상시킬 수 있습니다. 코드에서 붙여 넣은 코드에서 결과 및 오류 메서드를 사용자 지정 방식으로 호출하는 것처럼 보이는 것은 아무것도 표시되지 않았습니다.

Java 코드에 문제가있는 것은 아닌지 저는 강력하게 의심하고 있습니다. AFAIK, AsyncToken은 호출이 이루어지기 전에 응답자의 함수를 호출하도록 만들어지고 설정됩니다 (최소한 HTTPService 또는 amf와 함께 작동하는 방식). "유용하게"억압되는 오류가 있기를 기대하므로 코드를 단계별로 실행할 수 있습니다.

Robotlegs가 내포 한 MVCS 아키텍처의 "S"부분을 좀 더 자세히 살펴보고 모든 것을 관리하는 별도의 서비스 클래스를 만들고 프로세스를 시작하는 것이 좋습니다. 명령과 서비스간에 앞뒤로 통제를 넘기 려하지 말고 명령으로부터. 부작용으로 실제 데이터에 연결할 필요가 없을 때 (예 : 설계 작업 수행과 같은) 테스트 서비스를 위해 실제 서비스 인스턴스를 교체 할 수 있습니다.

+0

안녕하세요 @AmyBlankenship,이 링크에 따라 : http://help.adobe.com/ko_KR/FlashPlatform/reference/actionscript/3/mx/rpc/AsyncResponder.html 내 결과 및 오류 처리기가 올바른 것입니다. 연결 당 또는 요청 당 단 하나의 AsyncToken이 있는지 나는 모른다. 개인적으로 내 AsyncToken이 잘못된 메소드 서명으로 '손상'되었다고 생각하지 않습니다. 아이디어가 부족할 때 제안한대로 개별 서비스 클래스를 만들려고합니다. 너의 시간 동안 Thx – WWWillems

1

커밋 변경 사항이 없을 때 aysnctoken이 null을 반환합니다. 희망이 도움이됩니다.