GWT: заменить AbstractPlaceHistoryMapper пользовательским картографом, использующим отложенную привязку.

Похоже, что класс, сгенерированный для PlaceHistoryMapper, жестко закодирован для использования AbstractPlaceHistoryMapper в качестве суперкласса.

Итак, я пытаюсь обойти это, пытаясь заменить этот AbstractPlaceHistoryMapper моим собственным картографом, использующим отложенную привязку. Я использую следующее правило в своем *.gwt.xml:

<replace-with class="com.google.gwt.place.impl.AbstractPlaceHistoryMapper">
   <when-type-is class="com.test.sampleapp.CustomPlaceHistoryMapper" />
</replace-with>

Но почему-то замены не происходит. CustomPlaceHistoryMapper не запускается, и сгенерированный класс по-прежнему использует AbstractPlaceHistoryMapper.

Любые мысли/указатели относительно того, что может привести к такому поведению, высоко ценятся.

Примечание. Я также разместил это в группе GWT, но пока не получил ответа.


person Benevolent Engineer    schedule 15.02.2011    source источник
comment
Я думаю, что ответ Хильбранда правильный. GWT.create(X) означает, что только "X" проходит через отложенное связывание. Если сгенерированный класс «X» расширяет какой-либо класс, они (расширенный класс) не будут проходить через процесс отложенного связывания.   -  person Benevolent Engineer    schedule 16.02.2011
comment
В настоящее время (GWT 2.2), если вы используете готовые классы, связанные с местом (например, AbstractPlaceHistoryMapper и т. д.), которые предоставляет GWT, токены истории могут иметь только префикс формы: токен, например, #mail:inbox . У вас не может быть #mail/inbox или даже просто #mail. Очевидно, что это должно быть улучшено. В настоящее время с командой GWT открыта проблема в коде. .google.com/p/google-web-toolkit/issues/detail?id=5899, который позаботится об этом . Пометьте его звездочкой, если вы заинтересованы в реализации этой функции в будущих выпусках.   -  person Benevolent Engineer    schedule 16.02.2011


Ответы (2)


Чтобы отложенная привязка работала, необходимо создать класс с GWT.create(). Однако AbstractPlaceHistoryMapper используется только как расширенный класс. Таким образом, он никогда не будет создан с помощью GWT.create, а всегда будет создан экземпляром подкласса. Поэтому отложенное связывание в этом случае не сработает. Если вам нужна совершенно другая реализация, вам нужно реализовать собственный PlaceHistoryMapper и самостоятельно управлять известными токенами. Это также означает, что вы также не можете использовать аннотации истории.

В качестве примечания следует поменять местами имена классов в вашем правиле. Но для конечного результата это не имеет значения, так как в первую очередь это не сработает.

person Hilbrand Bouwkamp    schedule 15.02.2011

Совершенно возможно иметь собственные токены истории (например, #mail или #mail/bla вместо только #mail:inbox), используя готовые классы, связанные с местом, которые предоставляет GWT (2.0).

Вместо замены AbstractPlaceHistoryMapper вы можете создать экземпляр PlaceHistoryMapper по умолчанию, передав в его конструктор вашу реализацию PlaceHistoryMapper<T> или PlaceHistoryMapperWithFactory<T>.

eg.:

final PlaceHistoryHandler placeHistoryHandler = new PlaceHistoryHandler(new CustomHistoryMapper());

Затем вы сможете сопоставлять токены по своему усмотрению.

Я лично рекомендую вам использовать уникальный PlaceTokenizer в вашей пользовательской реализации картографа, чтобы мне не приходилось иметь внутренний класс PlaceTokenizer в каждом из ваших Place.

Надеюсь, это поможет. Не стесняйтесь задавать любые сомнения.

person drycode.it    schedule 23.02.2011