Подтвердить что ты не робот

GWT - случайное com.google.gwt.user.client.rpc.SerializationException

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

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)     at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:129)     at 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)     at com.google.gwt.user.server.rpc.RPC.encodeResponse(RPC.java:609)     на com.google.gwt.user.server.rpc.RPC.encodeResponseForSuccess(RPC.java:467)     at 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)     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)     на org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)     at 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)     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)     at 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)     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)     на org.apache.coyote.ajp.AjpAprProcessor.process(AjpAprProcessor.java:419)     at org.apache.coyote.ajp.AjpAprProtocol $AjpConnectionHandler.process(AjpAprProtocol.java:378)     at org.apache.tomcat.util.net.AprEndpoint $Worker.run(AprEndpoint.java:1508)     в java.lang.Thread.run(Thread.java:619)

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

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

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

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

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

Любые идеи?

Хольгер

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

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

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

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

Ответ 4

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

Ответ 5

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

Если ранее развернутое приложение не было очищено, GWT может быть смущен о том, какой файл RPC ему нужно загрузить, и вы в конечном итоге получите те, что SerializationException

Ответ 6

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

Ответ 7

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

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

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

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

Ответ 8

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

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

Ответ 9

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

Ответ 10

Я тоже получал исключение SerializationException, но я также видел, что эта ошибка появляется прямо перед исключением сериализации:

[uptimereports/+2,340102563369350884].: Пример: ошибка: не удается найти шаблон учетно-confirmation.vm

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

Ответ 11

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

Ответ 12

tu obtiens cette erreur parce que tu essaies de faire passer une liste d'objets non sérialisée par le tunel rpc. tu devras d'abord sérialiser ta liste d'objet avant le tranfert vers le tunel rpc. pour sérialiser ta liste, tu peux faire un truc du genre ci-dessous et faire passer ce nouveau objet vers le tunel rpc

public class ListObjet<T> implements Serializable{

   /** Constant used for serialization purpose (serial number). */
   private static final long serialVersionUID = 8153484637403868153L;

   private List<T> listObjet;

   public List<T> getListOjets()
   {
       return listObjet;
   }

   public void setListObjet(List<T> m_listObjet)
   {
       this.listObjet= m_listObjet;
   }
}

Мерси

Лагранжа