GWT клиентские и серверные реализации одного класса - PullRequest
9 голосов
/ 18 марта 2011

Есть ли способ по-разному реализовать один и тот же класс на клиенте и на сервере?

Чтобы избежать "Почему вы хотите это сделать?"вопрос .. Я уточню

Я конвертирую очень большое клиент-серверное приложение Java.В настоящее время он использует клиентский графический интерфейс Swing и общается с сервером через удаленное взаимодействие Spring (RPC).Использование GWT RPC с сервисами Spring не является проблемой, есть несколько превосходных примеров, и все, кажется, работают хорошо.

Несколько классов, общих для клиента и сервера, содержат данные, которые передаются обратно ивперед.Эти классы также содержат некоторое поведение, которое реализуется с использованием стандартных классов JRE.Например, один класс содержит, анализирует и форматирует дату и время, включая часовой пояс, летнее время и т. Д., В зависимости от языка.Я мог бы переписать / реорганизовать его, но приложение имеет более 10 миллионов SLOC, в результате чего буквально миллионы ссылок только на этот класс, так что основная перезапись не является экономически эффективной.отличная поддержка i18n для разбора и форматирования дат.Но реализация отличается от того, как JRE это делает.

Поэтому я ищу способ, которым я могу внедрить реализацию в оболочку моего класса DateTime, в зависимости от того, находится ли она в клиенте (используя GWT и нативный JS) или на сервере (используя JRE).Есть ли хитрый способ сделать это?Возможно, используя файл модуля XXXXX.gwt.xml.Я ищу общее решение.

Ответы [ 2 ]

5 голосов
/ 22 марта 2011

Вы хотите использовать <super-source> для , переопределяя одну реализацию пакета другой .Это то, что GWT использует для эмуляции классов Java Runtime и (среди прочего) предоставляет различные реализации для клиента и сервера com.google.gwt.regexp.shared.* классов.

0 голосов
/ 18 марта 2011

Я думаю, что вы ищете, это: <source path="client" /> в файле вашего проекта gwt.xml. Он сообщает генератору GWT, где искать код на стороне клиента для преобразования в JS. В моем проекте он настроен так:

<source path="client" />
<source path="shared" />

Обычно клиентский код находится в каталоге клиента, а в общем мы храним бины и некоторые оболочки для данных на стороне клиента и сервера.

Что вы можете сделать, это добавить пакеты, которые вы хотите преобразовать в клиент с исходным путем, как указано выше. Но вы должны помнить, что классы, которые вы собираетесь преобразовать, могут состоять только из объектов и свойств, которые генератор GWT может преобразовать в клиентский Java-скрипт. Я также не уверен, можно ли поставить более точный путь в исходный путь, например:

<source path="shared/beans/whatever" />

Другим недостатком является то, что если вы используете поддержку GWT i18n, он самостоятельно обрабатывает различные локали во время компиляции - и это хорошо. Если вы решите использовать свой собственный механизм, ваши классы должны содержать некоторую логику, чтобы быть в курсе используемой в настоящее время локали, которая должна быть совместима с GWT.

...