2012-04-10 2 views
0

내 gwt-app에는 "editUserPlace"및 "showUserPlace"와 같은 접두사를 제외한 모든 장소를 공유하는 곳이 있습니다 (이 경우 userId에 의해 상태가 결정됩니다) 나의 현재 시도는 "ShowUserPlace"와 "EditUserPlace"로 추상 "UserPlace"를 확장하는 것입니다 : @Prefix ("showUser")/@Prefix ("editUser") - 홀 토큰 화 코드를 복사해야합니다 (tokenizers 코드를 상속 할 수는 없지만 접두어를 무시하십시오.접두사를 제외한 모든 것을 공유하는 장소 또는 PlaceHistoryMapperWithFactory를 사용하는 방법

https://groups.google.com/d/topic/google-web-toolkit/pghMLX27Y4Y/discussion 토마스는 "PlaceHistoryMapperWithFactory"를 사용하도록 제안되었지만 나는 그것에 매달 리고 있습니다.

각 장소/토크 나이저에 대한 방법을 제공해야합니까 ("정상적인"장소에 대해서도 - 자체 토크 나이저 제공)? Abstract 및/또는 확장 클래스를 @WithTokenizer에 광고해야합니까? 어떻게/어디에서 setFactory를 호출해야합니까?

누구도 PlaceHistoryMapperWithFactory를 사용 했습니까? (비슷한 사용 사례 일 가능성이 있습니다)? 조언 좀 해줄 래? 누구나 같은 문제에 직면 해 다른 방법으로 해결 했습니까?

답변

1

공장 일을해야한다 : 당신은 또한 createPlace 메소드를 오버라이드 (override) 할를 하위 클래스 대신 토크 나이에 Provider<P>의 일종을 주입 할 수 물론

class MyFactory { 
    @Prefix("showUser") 
    public PlaceTokenizer<ShowUserPlace> showUserPlace() { 
     return new UserPlaceTokenizer<ShowUserPlace>() { 
     protected ShowUserPlace createPlace(String id) { 
      return new ShowUserPlace(id); 
     } 
     }; 
    } 

    @Prefix("showUser") 
    public PlaceTokenizer<EditUserPlace> showUserPlace() { 
     return new UserPlaceTokenizer<EditUserPlace>() { 
     protected EditUserPlace createPlace(String id) { 
      return new EditUserPlace(id); 
     } 
     }; 
    } 
} 

abstract class UserPlaceTokenizer<P extends UserPlace> implements PlaceTokenizer<P> { 
    public P getPlace(String token) { 
     // shared logic between both places: parses ID (or whatever) from token 
     return createPlace(id); 
    } 
    public String getToken(P place) { 
     // shared logic between both places: build token out of place 
     return token; 
    } 
    protected abstract P createPlace(String id); 
} 

.

@WithTokenizers과 함께 사용할 수 있습니다. 정확히 동일한 장소 나 접두사에 대해 두 개의 토큰 화 프로그램을 찾으면 발전기가 질식합니다.

당신은 당신이 GWT.create() 당신의 매퍼 (실제로, 어떤 중요한 것은 당신이 매퍼의 getPlace 또는 getToken 방법에 대한 호출하기 전에 공장을 설정이다) 직후 setFactory를 호출해야합니다.

+0

thx는 설명 토마스입니다. 내가 gin- how/setFactory를 어디에서 호출 할까? 아마도 onModuleLoad ("개인 최종 ClientInjector injector = GWT.create (ClientInjector.class);") 뒤에 있습니까? 복사 붙여 넣기 오류가 발생 했습니까? 접두사와 메서드 이름이 달라야한다고 생각하니?! – dermoritz

+0

나는 조금 문제가있다 : 어떻게 UserPlaceTokenizer를 구현 하는가? 그것은 두 종류 (PlaceTokenizer 및 ... )를 구현해야합니까, 아니면 일반적 일 수 있습니까? - PlaceTokenizer 는 작동하지 않습니다. – dermoritz

+0

대답이 업데이트되었습니다 (직접 알아 낸 것처럼'getPlace'에 대한 장소 별 코드를 제공해야합니다). GIN에 관해서는, 당신은 GWT.create()'+'setFactory'를 프로 바이더 (또는 프로 바이더 메소드)에서 직접 할 수 있습니다; 또는 매퍼 인터페이스에서'setFactory'를 오버라이드하고'@ Inject'로 주석을 달아라. (GIN은 인터페이스 바로 뒤 GWT.create()를 호출해야한다). –

0

가 좋아 나는 일반적인 토크 나이 ("UserPlaceTokenizer")과 함께 주변에 바이올린을하지만 포기 : 문제는 공장 내가 일반적인 토큰 화를 만들려고 그렇게 먼저 구체적인 클래스의 Tokenizers을 필요로한다는 것입니다 :

public static class Tokenizer<T extends UserPlace> implements PlaceTokenizer<T> { 

    @Override 
    public final T getPlace(final String token) { 
     return (T) new UserPlace(token); //BAD 
    } 

    @Override 
    public final String getToken(final T place) { 
     return place.getToken(); 
    } 
} 

문제는 (T)에 대한 UserPlace의 캐스트입니다 - 작동하지 않습니다 (UserPlace를 구체적인 하위 클래스로 캐스트 할 수 없음). 그래서 tokenizer 인터페이스를 만족시키기 위해이 인스턴스를 가져 오기위한 "새로운 ShowUserPlace 반환 (...)"이 필요합니다. 오랫동안 이야기하기에는 너무 오래 걸리지 않습니다. 이전 솔루션으로 돌아 왔습니다. 확장 클래스는 수퍼 클래스의 생성자를 복사하고 자체 생성자 (슈퍼 생성자를 호출하는)를 호출하는 별도의 Tokenizers를 제공합니다.

public class ShowUserPlace extends UserPlace { 

public ShowUserPlace(String token) { 
    super(token); 
} 

@Prefix(value = "showUser") 
public static class Tokenizer implements PlaceTokenizer<ShowUserPlace> { 

    @Override 
    public final ShowUserPlace getPlace(final String token) { 
     return new ShowUserPlace(token); 
    } 

    @Override 
    public final String getToken(final ShowUserPlace place) { 
     return place.getToken(); 
    } 
} 
} 

중간 솔루션은 인터페이스의 메소드를 제공하는 추상 토큰 화 프로그램입니다. getPlace는 추상 메소드 (T를 리턴)를 호출하고 구체적인 구현은 구체적인 생성자를 호출합니다 (또한 상위 생성자 만 호출 함). 결국이 솔루션은 위의 솔루션과 거의 동일한 수의 라인과 복사 된 코드를 갖게됩니다.

나는 아직도 이것에 대해 나쁜 감정을 갖고 있습니다. 아마도 ".WithFactory"또는 이와 같은 유스 케이스에 직면하는 완전히 다른 방식의 해결책 일 것입니다.

관련 문제