2012-04-17 2 views
1

왜이 예외가 발생하는지 도와 주시겠습니까?

제가

불행히도 RF이 최초 호출 서버의 예외를 발생 (상세 here이다) 그래서 GWT 클라이언트 안드로이드 클라이언트에 모두 사용할 수있는 별도의 용기에 RequestFactory 프록시 문맥 인터페이스를 추출 하였다. 예외는 다음과 같습니다.

com.google.web.bindery.requestfactory.server.UnexpectedException: No RequestContext for operation LPZEK7DlYkoG1$NQ5MjHlmuRChk= 
    at com.google.web.bindery.requestfactory.server.ServiceLayerDecorator.die(ServiceLayerDecorator.java:216) 
    at com.google.web.bindery.requestfactory.server.ResolverServiceLayer.resolveRequestContext(ResolverServiceLayer.java:154) 

아래는 제 팩토리 인터페이스입니다. 당신이 볼 수 있듯이 주석을 ServiceName으로 대체해야했습니다. 왜냐하면 Guice 주사를 사용하여 모든 맞춤형 로케이터를 모바일 장치로 옮길 용기에 컴파일하고 싶지 않았기 때문입니다. 서버의 디버거에서 던진 예외가 나는 com.google.web.bindery.requestfactory.vm.impl.Deobfuscator의 인스턴스가 초기화되고 빈 operationData 필드가 볼 때, 그래서

Cannot fully validate context since domain type com.blah.courierApp.server.dao.UserServiceDao is not available. 
You must run the ValidationTool as part of your server build process. 
Add @SuppressWarnings("requestfactory") to dismiss. 

: 나는 그것을 컴파일

public interface AdminRequestFactory extends RequestFactory 
{ 
    // @Service(value = UserServiceDao.class, locator = InjectingServiceLocator.class) 
    @ServiceName(value = "com.blah.courierApp.server.dao.UserServiceDao", locator = "com.blah.courierApp.server.inject.InjectingServiceLocator") 
    public interface GaeUserServiceContext extends RequestContext 
    { 
     public Request<String> createLogoutURL(String destinationURL); 
     public Request<GaeUser> getCurrentUser(); 
    } 

    // @Service(value = OrderDao.class, locator = InjectingServiceLocator.class) 
    @ServiceName(value = "com.blah.courierApp.server.dao.OrderDao", locator = "com.blah.courierApp.server.inject.InjectingServiceLocator") 
    public interface OrderRequestContext extends RequestContext 
    { 
     Request<List<OrderProxy>> listAll(); 
     Request<Void> delete(Long id); 
     Request<Void> createOrder(OrderProxy order); 
     Request<OrderProxy> findOrderById(long id); 
     Request<Void> updateOrderState(long id, StateType newStateType); 
    } 

    GaeUserServiceContext contextUserService(); 
    OrderRequestContext contextOrder(); 
} 

는 RF 주석 도구는 다음과 같은 경고했다 RequestFactory 주석 도구에 의해 생성 된 DeobfuscatorBuilder 클래스에 의해 생성됩니다.

그래서 ... 나는 그 클래스를 디 컴파일이 발견 공장

public final class AdminRequestFactoryDeobfuscatorBuilder extends Deobfuscator.Builder 
{ 
    public AdminRequestFactoryDeobfuscatorBuilder() 
    { 
    withRawTypeToken("w1Qg$YHpDaNcHrR5HZ$23y518nA=", "com.google.web.bindery.requestfactory.shared.EntityProxy"); 
    withRawTypeToken("8KVVbwaaAtl6KgQNlOTsLCp9TIU=", "com.google.web.bindery.requestfactory.shared.ValueProxy"); 
    withRawTypeToken("FXHD5YU0TiUl3uBaepdkYaowx9k=", "com.google.web.bindery.requestfactory.shared.BaseProxy"); 
    withRawTypeToken("5vjE9LUy$l0uvi4kMYpS3JA1WEE=", "com.blah.shared.model.GaeUser"); 
    withRawTypeToken("8KVVbwaaAtl6KgQNlOTsLCp9TIU=", "com.google.web.bindery.requestfactory.shared.ValueProxy"); 
    withRawTypeToken("5a7OV4PSV$1xemsooKLfEQ4g5yY=", "com.blah.shared.proxies.OrderProxy"); 
    withRawTypeToken("neR_xIhE5oZsc0HbnkAMa8A88yw=", "com.blah.shared.proxies.OrderStateProxy"); 
    withRawTypeToken("t6gMQWDROJnYvqYhNURV8pd$sn4=", "com.blah.shared.proxies.OrganizationProxy"); 
    withRawTypeToken("1o45xgS$5bIkBKF4wlR8oMw_FSo=", "com.blah.shared.proxies.PersonProxy"); 
    withRawTypeToken("FXHD5YU0TiUl3uBaepdkYaowx9k=", "com.google.web.bindery.requestfactory.shared.BaseProxy"); 
    } 
} 

이 발생하지 않은 토큰을. 따라서 Deobfuscator.Builder.withOperation에 대한 호출이 없기 때문에 클라이언트에서 호출이 왔을 때 내 서버에서 컨텍스트를 찾을 수 없습니다.

질문은 다음과 같습니다

  • 왜 RequestFactory 주석 도구 공장 (연산)에 대한 토큰을 생성하지 않는 이유는 무엇입니까?
  • 어떻게 해결할 수 있습니까?

답변

1

글쎄, 그것은 꽤 까다로운했다 ...하지만 RF 주석 도구의 디버깅은 RF 주석 프로세서의 클래스 경로에 @ServiceName에서 참조 도메인 클래스를에 당신이 :

이 밝혀 도움 . 닭고기와 달걀 문제를 일으 킵니다. SharedClasses 모듈을 컴파일하여 메인 모듈을 컴파일해야하지만 메인 모듈의 도메인 클래스를 컴파일하여 SharedClasses 모듈을 컴파일해야합니다. 여기

내가 무슨 짓을 : SharedClasses 모듈

  • 장애인 RF 주석 처리. 그것은 내가 비록 프로젝트 설정에서 전체 클래스 이름을 하드 코딩 한 것을 짜증 매개 변수 rootOverride = com.blah.shared.factories.AdminRequestFactory

을 사용하여 처리해야하는 주요 모듈 I 명시 적으로 지정된 RF 공장의 RF 주석 프로세서 에서

  • .

    좀 더 세련된 방법을 알고 계시다면 알려 주시기 바랍니다.

  • 0

    나도 같은 문제에 부딪쳤다. 기본적으로 나는 3 개의 GWT 모듈을 가지고있다. 1. 주 모듈과 두 번째 모듈에는 requestFactory, 서버 도메인 클래스 및 클라이언트 측 프록시 값이있다. 나는 당신의 솔루션이 제 자리에 있어야한다고 확신합니다. 그러나 나는 메이븐 빌드 단계에서 rootOverride를 지정하는 방법을 혼동합니다. pom.xml 구조의 모든 포인터는 엄청난 도움이 될 것입니다.

    +0

    분명히 대답이 아니므로이 게시물을 삭제하시는 것이 좋습니다 (답변으로 게시 할 수 있음). – fdreger