Политика сериализации gwt в размещенном режиме не синхронизирована

При запуске моего приложения GWT (gwt 2.0.4) в размещенном режиме, вызывая методы RPC, запущенные на удаленном Tomcat, я получаю исключение сериализации GWT:

INFO: GwtRpcEventSrvc: ERROR: The serialization policy file '/84EC7BA65AF8175BAA99B47877FDE163.gwt.rpc' was not found; did you forget to include it in this deployment?

SEVERE: GwtRpcEventSrvc: WARNING: Failed to get the SerializationPolicy '84EC7BA65AF8175BAA99B47877FDE163' for module 'http://host:19980/MYAPP/'; a legacy, 1.3.3 compatible, serialization policy will be used.  Youmay experience SerializationExceptions as a result.

SEVERE: Exception while dispatching incoming RPC call
Throwable occurred: com.google.gwt.user.client.rpc.SerializationException: java.lang.reflect.InvocationTargetException
.at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeWithCustomSerializer(ServerSerializationStreamWriter.java:760)
.at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.java:723)
.at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:612)
.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)
...
Caused by: com.google.gwt.user.client.rpc.SerializationException: Type 'com.mypackage.data.MyData' was not assignable to 'com.google.gwt.user.client.rpc.IsSerializable' and did not have a custom field serializer.For security purposes, this type will not be serialized.: instance = com.mypackage.data.MyData@1b061b06
.at 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.client.rpc.core.java.util.Collection_CustomFieldSerializerBase.serialize(Collection_CustomFieldSerializerBase.java:43)
.at com.google.gwt.user.client.rpc.core.java.util.LinkedList_CustomFieldSerializer.serialize(LinkedList_CustomFieldSerializer.java:36)
.... 33 more

Размещенный режим генерирует файлы политики сериализации (* .gwt.rpc) с разными md5, чем те, которые были созданы во время компиляции GWT - они развернуты на моем сервере. В GWT отсутствует файл политики сериализации, который нужен клиенту в режиме хоста.

При работе в режиме non-hosted все нормально.

Я попытался запустить размещенный режим через конфигурацию отладки Ant или Eclipse с теми же результатами. Путь к классам компиляции GWT и путь к классам в режиме хоста (включая) совпадают.

Скрипт Ant компиляции GWT:

<java failonerror="true" fork="true" classname="com.google.gwt.dev.Compiler">
  <classpath>
    <pathelement location="${basedir}/src" />
    <pathelement location="${dir.build.root}/ProjectA/src" />
    <pathelement location="${dir.build.root}/ProjectB/src" />
    <pathelement location="${dir.build.root}/ProjectC/src" />
    <pathelement location="${dir.build.root}/ProjectD/src" />
    <pathelement location="${dir.build.root}/ProjectE/src" />
    <pathelement location="${dir.root}/ProjectD/src" />
    <pathelement location="${dir.root}/THIRDPARTY/build/athirdparty.jar" />
    <pathelement location="${dir.commons.gwtcompiler}/gwt-user.jar" />
    <pathelement location="${dir.commons.gwtcompiler}/gwt-dev.jar" />
    <pathelement location="../ExternalLibs/libs/gwt-log-3.0.0.jar" />
<!-- JAXB API sources needed for GWT compilation of JAXB annotated classes -->
    <pathelement location="../ExternalLibs/nonshipjars/jaxb-api-src.zip" />
  </classpath>
  <jvmarg value="-Xmx1g" />
  <jvmarg value="-Dgwt.nowarn.metadata" />
  <arg line="-localWorkers 2 -style OBF" />
  <arg line="-war ${basedir}/www" />
  <arg line="-extra ${basedir}/build" />
  <arg value="com.myapp.Main" />
</java>

Запуск размещенного режима - скрипт Ant:

<target name="hosted" description="Run hosted mode">
  <java failonerror="true" fork="true" classname="com.google.gwt.dev.HostedMode">
    <classpath>
        <pathelement location="${basedir}/src" />
        <pathelement location="${dir.build.root}/ProjectA/src" />
        <pathelement location="${dir.build.root}/ProjectB/src" />
        <pathelement location="${dir.build.root}/ProjectC/src" />
        <pathelement location="${dir.build.root}/ProjectD/src" />
        <pathelement location="${dir.build.root}/ProjectE/src" />
        <pathelement location="${dir.root}/ProjectD/src" />
        <pathelement location="${dir.root}/THIRDPARTY/build/athirdparty.jar" />
        <pathelement location="${dir.commons.gwtcompiler}/gwt-user.jar" />
        <pathelement location="${dir.commons.gwtcompiler}/gwt-dev.jar" />
        <pathelement location="../ExternalLibs/libs/gwt-log-3.0.0.jar" />
    <!-- JAXB API sources needed for GWT compilation of JAXB annotated classes -->
        <pathelement location="../ExternalLibs/nonshipjars/jaxb-api-src.zip" />
    </classpath>
    <jvmarg value="-Xmx1g" />
    <jvmarg value="-Dgwt.nowarn.metadata" />
    <arg line="com.myapp.Main" />
    <arg line="-startupUrl" />
    <arg line=" http://host:19980/MYAPP/Main.html" />
    <arg line="-whitelist" />
    <arg line="^http[:][/][/]host[:]19980" />
    <arg line="-whitelist" />
    <arg line=" ^http[:][/][/]localhost" />
    <arg line="-whitelist" />
    <arg line="^http[:][/][/]127.0.0.1" />
    <arg line="-port" />
    <arg line="8080" />
    <arg line="-noserver" />
    <arg line="-logLevel" />
    <arg line="DEBUG" />
  </java>
</target>

Подпись метода RPC:

public List<MyData> getSmpeWorkDddefZonesData(String processId);

MyData определение (объявлено в ProjectE, который не является проектом GWT - уровень данных):

package com.mypackage.data;

import java.io.Serializable;

public interface MyData extends Serializable {...

MyData связана в модуле, унаследованном от другого модуля GWT: com.mypackage.Data.gwt.xml:

<module>
  <source path="data" />
</module>

Главный модуль com.myapp.Main.gwt.xml:

...
  <inherits name="com.mypackage.Data" />
...

Как заставить хостинг генерировать одинаковые файлы политики сериализации?


person padis    schedule 12.08.2011    source источник


Ответы (2)


У меня была такая же проблема. Единственное решение, которое я вижу, - убедиться, что у вас одинаковые файлы .gwt.rpc с обеих сторон.

Это означает, что каждый раз, когда вы запускаете или перезагружаете Dev Mode, вы должны заменять старые файлы .gwt.rpc, развернутые на вашем веб-сервере, новыми сгенерированными.

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

person Adrian B.    schedule 27.06.2012
comment
Спасибо, помогло! Просто чтобы добавить больше деталей: мне пришлось запустить размещенный режим с параметром -war / path / to / my / built / war вместо пути по умолчанию. - person foch; 15.07.2013

На основе того, что я вижу в com.google.gwt.user.rebind.rpc.ProxyCreator, GWT генерирует имена файлов политики сериализации .gwt.rpc по их содержимому (md5).

Поэтому по какой-то причине политика сериализации в режиме Super Dev Mode отличается от политики, созданной во время обычной сборки.

Следующий подход решил проблему для меня:

  1. Откройте файл политики сериализации .gwt.rpc, созданный для обычной сборки.
  2. Откройте файл политики сериализации .gwt.rpc, созданный для режима Super Dev Mode. Вы можете узнать, где он находится, заглянув в рабочий каталог, напечатанный при запуске режима Super Dev Mode. Например. в моем случае это было: "рабочий каталог: C: \ Users \ your_user \ AppData \ Local \ Temp \ gwt-codeserver-5658052675265790575.tmp"
  3. Сравните 2 файла - это может дать вам довольно хороший намек на то, где может быть проблема. В моем случае к политике сериализации добавлялись 2 ненужных типа, и я мог просто полностью удалить их из проекта.
  4. После устранения несоответствий имя файлов .gwt.rpc должно снова совпадать, и проблема будет устранена :)
person machinery    schedule 22.03.2016