GWT - случайный com.google.gwt.user.client.rpc.SerializationException - PullRequest
38 голосов
/ 23 января 2010

нас преследуют случайные случаи исключений, таких как:

com.google.gwt.user.client.rpc.SerializationException: тип «xxx» не был назначен для «com.google.gwt.user.client.rpc.IsSerializable» и не имел настраиваемого поля сериализатора. в целях безопасности этот тип не будет сериализован .: instance = xxx на com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize (ServerSerializationStreamWriter.java:610) на com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject (AbstractSerializationStreamWriter.java:129) на com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter $ ValueWriter $ 8.write (ServerSerializationStreamWriter.java:152) на com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeValue (ServerSerializationStreamWriter.java:534) на com.google.gwt.user.server.rpc.RPC.encodeResponse (RPC.java:609) на com.google.gwt.user.server.rpc.RPC.encodeResponseForSuccess (RPC.java:467) на com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse (RPC.java:564) на com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall (RemoteServiceServlet.java:188) в de.softconex.travicemanager.server.TraviceManagerServiceImpl.processCall (TraviceManagerServiceImpl.java:615) на com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost (RemoteServiceServlet.java:224) на com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost (AbstractRemoteServiceServlet.java:62) на javax.servlet.http.HttpServlet.service (HttpServlet.java:710) на javax.servlet.http.HttpServlet.service (HttpServlet.java:803) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:290) в org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:206) в org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter (ReplyHeaderFilter.java:96) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:235) в org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:206) в org.apache.catalina.core.StandardWrapperValve.invoke (StandardWrapperValve.java:230) в org.apache.catalina.core.StandardContextValve.invoke (StandardContextValve.java:175) в org.jboss.web.tomcat.security.SecurityAssociationValve.invoke (SecurityAssociationValve.java:179) в org.jboss.web.tomcat.security.JaccContextValve.invoke (JaccContextValve.java:84) в org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java:127) в org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:102) в org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke (CachedConnectionValve.java:157) в org.apache.catalina.core.StandardEngineValve.invoke (StandardEngineValve.java:109) в org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:262) в org.apache.coyote.ajp.AjpAprProcessor.process (AjpAprProcessor.java:419) в org.apache.coyote.ajp.AjpAprProtocol $ AjpConnectionHandler.process (AjpAprProtocol.java:378) в org.apache.tomcat.util.net.AprEndpoint $ Worker.run (AprEndpoint.java:1508) at java.lang.Thread.run (Thread.java:619)

Приложение нормально работает нормально. Указанный класс реализует Serializable (весь граф объектов).

Пока единственными закономерностями / наблюдениями являются:

  • похоже, что проблема возникает только тогда, когда приложение используется внутри iframe

  • проблема возникает, когда была развернута новая версия приложения

  • запуск firefox в режиме конфиденциальности (отключение всех кешей и т. Д.) Не решает проблему

Есть идеи?

Хольгер

Ответы [ 12 ]

32 голосов
/ 23 января 2010

вы проверили http://code.google.com/webtoolkit/doc/latest/tutorial/RPC.html#serialize в статье говорится: Он имеет конструктор по умолчанию (без аргумента) с любым модификатором доступа (например, private Foo(){} будет работать)

Я всегда забываю const нулевого аргумента. когда я делаю сериализуемый объект: D

18 голосов
/ 29 октября 2011

Я столкнулся с проблемой при использовании Tomcat6 + Devmode в Ubuntu Lucid amd64. Использование com.google.gwt.user.client.rpc.IsSerializable вместо java.io.Serializable , похоже, решило проблему.

16 голосов
/ 31 марта 2013

Очень вероятная причина - старая версия клиента все еще кэшируется в браузере. Он отправляет запросы RPC, но сервер уже перезапущен и имеет более новые версии файлов RPC (* .symbolMap)

13 голосов
/ 19 сентября 2011

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

Возможно, они загружены неправильно, единственный найденный нами обходной путь - перезапуск сервера после каждой ошибки сериализации.

Проблема связана с тем, что GWT будет генерировать свои файлы политики сериализации во время выполнения, предполагая, что вы работаете в размещенном режиме. В режиме компиляции GWT сгенерирует все необходимые файлы во время компиляции. AFAIK, tomcat не может загрузить файлы ресурсов во время выполнения и, следовательно, не будет включать файлы сериализации каждый раз, когда они нужны в первый раз.

При перезапуске сервера tomcat может забрать ранее сгенерированный файл, и, следовательно, после перезапуска вы не должны получить такую ​​же ошибку.

Вы можете это проверить?

5 голосов
/ 07 сентября 2010

Если вы работаете на JBoss, это может быть связано с тем, что ранее развернутое приложение не удаляется при отмене развертывания. Чтобы это исправить, вы должны изменить следующий файл в JBoss: $ {} JBOSS_HOME /server/default/deployers/jbossweb.deployer/META-INF/war-deployers-jboss-beans.xml и установите для следующего атрибута значение true: deleteWorkDirOnContextDestroy

Когда ранее развернутое приложение не очищено, GWT может запутаться в том, какой RPC-файл ему нужно загрузить, и вы получите исключение SerializationException

4 голосов
/ 23 февраля 2013

У меня была такая же проблема, и я нашел решение от другого человека:

"Существует вероятность того, что у вас есть класс, который реализует Serializable, и у вас есть поле атрибута внутри этого класса, которое не Serializable, поэтому вы можете получить это исключение."

Большое спасибо этому человеку:)

Мой совет - сделать так, чтобы все поля (не являющиеся примитивными типами) в вашем классе также реализовали Serializable! Это решило мою проблему.

3 голосов
/ 19 февраля 2013

Эта проблема возникает, когда приложение GWT 2.5 компилируется с использованием JDK 1.7. GWT 2.5 поддерживает JDK 1.6, и использование этой версии JDK решит эту проблему.

2 голосов
/ 06 марта 2011

Таким образом, файлы RPC уникальны, потому что они загружаются сервлетами, а также используются в GWT. См. http://code.google.com/webtoolkit/release-notes.html#Release_Notes_1_4_59, где говорится: «Этот файл должен быть развернут на вашем веб-сервере как общедоступный ресурс, доступный из RemoteServiceServlet через ServletContext.getResource ()» *

Возможно ли, что новое приложение динамически перезагружается, и getResource каким-то образом дает сбой? Исправляет ли перезапуск приложения?

1 голос
/ 17 мая 2011

У меня была та же ошибка, и я исправил ее, очистив кэш просмотра и историю навигации.

0 голосов
/ 28 мая 2016

Лучший способ узнать точную проблему - это скомпилировать ваш код с помощью -logLevel DEBUG или TRACE и проверить внутри валидационных единиц. Я уверен, что вы также сможете найти точную проблему с номерами строк.

...