2013-08-02 4 views
2

У меня есть приложение GWT, которое работает очень безупречно в режиме Dev с встроенным серверным сервером GWT.Исключение сериализации интермитантов с режимом GWT Dev и внешним сервером

Однако мне нужно перейти на внешний сервер причала (по разным причинам). Я точно выполнил документацию GWT Compile & Debug для настройки внешнего сервера.

мое приложение работает, однако 2/3 времени на нагрузку я получаю исключение сериализации похожее на это (на стороне сервера):

com.google.gwt.user.client.rpc.SerializationException: Тип «my.package.impl.ContentTypeImpl» не был назначен для «com.google.gwt.user.client.rpc.IsSerializable» и не имел настраиваемого поляризатора поля. Для целей безопасности этот тип не будет сериализован: instance = [email protected]

Я уверен, что этот класс является сериализуемым, и я гарантировал, что я скомпилировал свое приложение и перенес статические активы в свою военную директорию внешних серверов. Как я уже сказал, он работает каждый третий раз, когда я обновляю браузер.

Любые предложения?

Спасибо!

ответ

3

от: http://www.gwtproject.org/doc/latest/tutorial/RPC.html#serialize

Класс сериализует, если она отвечает этим три требований:

  1. Он реализует либо Java Сериализуемого или GWT IsSerializable интерфейса, либо непосредственно, либо потому, что оно происходит из суперкласса это делает. < -
  2. Его неконечное, не преходящие поля экземпляра сами по себе являются сериализации и
  3. Он имеет по умолчанию (нулевой аргумент) конструктор любого доступа модификатора (например, частный Foo() {} будет работать
+0

Спасибо, но, как я уже говорил, я уверен, что этот класс соответствует критерию сериализации, поскольку он использовался в течение нескольких месяцев как в обычном режиме GWT-dev, так и в режиме производства. Эта проблема возникает только периодически с настройкой noserver. Любые другие мысли? –

+0

Вы использовали com.google.gwt.user.client.rpc.IsSerializable вместо java.io.Serializable? Другая возможная причина - десинк из кешированной версии. Попробуйте скопировать последние файлы на сервер и очистить кеш браузера. – Vjeetje

+0

Я уверен, что все, что я использую, это java.io.Serializable, но есть много кода, поэтому я вернусь и сделаю это. Из любопытства используется com.google.gwt.user.client.rpc.IsSerializable, не так ли? В документации указано, что это должно работать, нет? –

2

Я полагаю, что вы используете отдельный военный каталог на своем внешнем сервере, скопировали все свои статические данные (включая файлы * .gwt.rpc) в этот военный каталог, а затем изменили что-то о сериализуемые модели, которые вы передаете по своим вызовам RPC. Всякий раз, когда эти модели меняют, сгенерированные файлы .gwt.rpc будут изменены. Ваш сервер будет использовать o ne вариация политик сериализации и отладка вашего клиента java будет использовать другую.

Я могу думать о двух вариантах:

  1. Убедитесь, чтобы скопировать .gwt.rpc файлы на папку сервера войны. Для этого вы можете создать обычную ant-задачу.

  2. Настройте внешний веб-сервер, чтобы указать тот же военный каталог, который вы используете для внутренней отладки GWT. Таким образом, когда GWT генерирует изменения, они автоматически попадают в нужное место.

Вариант № 2 - это тот, с которым я столкнулся при работе с большими сложными системами, для которых требуется внешний сервер.

+0

Это была моя мысль, но я использую один и тот же военный каталог. Однако классы, которые система жалуется, находятся в отдельном модуле maven. Мне интересно, есть ли что-то, что Intellij делает при запуске в полном режиме dev, что не происходит, когда установлен флаг noserver? –

+0

xsee, есть ли что-то особенное, что я должен сделать, чтобы это произошло. –

+0

Хммм, я не использую IntelliJ, поэтому мне сложно размышлять, но я сомневаюсь, что он делает что-то, что слишком сильно отличается от того, что делает затмение в этом сценарии. Интересно, кэширует ли ваш внешний сервер Jetty политику сериализации? Я не использовал внешний Jetty через некоторое время, поэтому у меня нет файлов конфигурации, удобных для ссылки. – xsee