Прерывистое исключение сериализации с режимом разработки GWT и внешним сервером

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

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

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

com.google.gwt.user.client.rpc.SerializationException: тип «my.package.impl.ContentTypeImpl» не может быть назначен «com.google.gwt.user.client.rpc.IsSerializable» и не имеет настраиваемого поля serializer. В целях безопасности этот тип не будет сериализован.: instance = my.package.impl.ContentTypeImpl@5e5edf72

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

Какие-либо предложения?

Спасибо!


person Casey Jordan    schedule 02.08.2013    source источник


Ответы (2)


из: http://www.gwtproject.org/doc/latest/tutorial/RPC.html#serialize

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

  1. Он реализует интерфейс Java Serializable или GWT IsSerializable либо напрямую, либо потому, что он является производным от суперкласса, который делает это. ‹--
  2. Его неконечные, невременные поля экземпляра сами по себе сериализуемы, и
  3. Он имеет конструктор по умолчанию (нулевой аргумент) с любым модификатором доступа (например, private Foo(){} будет работать
person Vjeetje    schedule 02.08.2013
comment
Спасибо, но, как я уже говорил, я уверен, что этот класс соответствует критериям сериализации, поскольку он использовался в течение нескольких месяцев как в обычном режиме разработки GWT, так и в рабочем режиме. Эта проблема периодически возникает только при настройке noserver. Любые другие мысли? - person Casey Jordan; 03.08.2013
comment
Вы использовали com.google.gwt.user.client.rpc.IsSerializable вместо java.io.Serializable? Другая возможная причина — рассинхронизация кешированной версии. Попробуйте скопировать последние файлы на сервер и очистить кеш браузера. - person Vjeetje; 03.08.2013
comment
Я почти уверен, что все, что я использую, это java.io.Serializable, но там много кода, поэтому я вернусь и удостоверюсь. Из любопытства, использование com.google.gwt.user.client.rpc.IsSerializable бесполезно? В документации сказано, что любой из них должен работать, не так ли? - person Casey Jordan; 08.08.2013
comment
Вы должны использовать com.google.gwt.user.client.rpc.IsSerializable вместо java.io.Serializable. Есть и другие люди с такой же проблемой, которые решили ее с помощью смены интерфейсов. - person Vjeetje; 09.08.2013
comment
Интересный! Я начал менять некоторые из своих классов на использование IsSerializable, и это устранило ошибки для этих классов. Означает ли это, что классы, реализующие IsSerializable, автоматически заносятся в белый список и их не нужно создавать в файлах gwt.rpc? - person Casey Jordan; 12.08.2013
comment
Компиляция GWT должна справиться с этим за вас. - person Vjeetje; 12.08.2013
comment
В том-то и дело, что я пытаюсь избежать перекомпиляции каждый раз, когда меняю асинхронный интерфейс, потому что наше приложение очень большое и это может занять 10 минут или больше. Поэтому мне было интересно, сделает ли использование IsSerializable последующие компиляции ненужными. Спасибо за помощь! - person Casey Jordan; 12.08.2013

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

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

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

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

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

person xsee    schedule 03.08.2013
comment
Это была и моя мысль, но я использую тот же военный каталог. Однако классы, на которые жалуется система, находятся в отдельном модуле maven. Мне интересно, есть ли что-то, что Intellij делает при работе в полном режиме разработки, чего нет, когда установлен флаг noserver? - person Casey Jordan; 04.08.2013
comment
xsee, Есть ли что-то особенное, что я должен сделать, чтобы это произошло? - person Casey Jordan; 08.08.2013
comment
Хм, я не использую IntelliJ, поэтому мне трудно строить предположения, но я сомневаюсь, что он делает что-то, что слишком отличается от того, что делает eclipse в этом сценарии. Интересно, кэширует ли ваш внешний сервер Jetty политики сериализации? Я давно не использовал внешний Jetty, поэтому у меня нет файлов конфигурации, на которые можно было бы сослаться. - person xsee; 08.08.2013
comment
Хорошо спасибо. Я думаю, что это может быть связано с настройкой компилятора. Я исследую ;) - person Casey Jordan; 08.08.2013