Проблемы с GWT и Enum - PullRequest
       5

Проблемы с GWT и Enum

10 голосов
/ 17 ноября 2010

У меня есть перечисление в клиентской части приложения GWT, и я получаю исключение при попытке его запустить, что связано с проблемами сериализации. Я делаю что-то не так? Я прочитал, что перечисления поддерживаются GWT, и я использую последнюю версию.

Перечисление:

public enum AnEnum implements Serializable {

    ITEM_A("Item a description"), ITEM_B("Item b description");

    private String description;

    private AnEnum(String description) {
        this.description = description;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

}

Исключение:

Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeWithCustomSerializer(ServerSerializationStreamWriter.java:742)
    ... 47 more
Caused by: com.google.gwt.user.client.rpc.SerializationException: Type '(...).client.(...).AnEnum' was not included in the set of types which can be serialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be serialized.: instance = ITEM_A
    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)
    ... 52 more

Ответы [ 7 ]

14 голосов
/ 17 ноября 2010

Добавьте интерфейс IsSerializable, используемый по умолчанию конструктор без аргументов, и убедитесь, что он находится в одном из путей, указанных в тегах источника в файле gwt.xml. <source path="client">

Я действительно думаю, что третье предложение - это проблема; Я помню эту проблему раньше, и это было потому, что у меня был dto вне исходных путей.

Вы можете иметь несколько тегов источника.

<source path="common" />
<source path="client" />

Один шаблон заключается в том, чтобы поместить постоянные объекты непосредственно в com.mysite.common, а также коллажи сохраненных элементов, которые передаются по проводам в com.mysite.common.dto, и, конечно, клиентский графический код в клиенте. 1009 *

package com.mysite.client;

import java.io.Serializable;

import com.google.gwt.user.client.rpc.IsSerializable;

public enum AnEnum implements Serializable, IsSerializable {

    ITEM_A("Item a description"), ITEM_B("Item b description");

    private String description;

    AnEnum() {
    }

    AnEnum(String description) {
        this.description = description;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

}
4 голосов
/ 29 апреля 2014

Вы можете попробовать этот контрольный список:

  1. Убедитесь, что класс имеет конструктор по умолчанию (без аргументов)
  2. Убедитесь, что класс реализует Serializable или IsSerializable или реализует интерфейс, которыйрасширяет Serializable или расширяет класс, реализующий Serializable
  3. Убедитесь, что класс находится в пакете client. * или ...
  4. Убедитесь, что класс отсутствует в пакете client. *, который скомпилированв вашем определении GWT XML-модуля.По умолчанию присутствует.Если ваш класс находится в другом пакете, вы должны добавить его в исходный код.Например, если ваш класс находится в домене. * Вы должны добавить его в XML как.Имейте в виду, что класс не может принадлежать серверу!Подробнее на странице GWT: http://code.google.com/webtoolkit/doc/latest/DevGuideOrganizingProjects.html#DevGuideModuleXml
  5. Если вы включаете класс из другого проекта GWT, вам нужно добавить наследование в определение вашего модуля xml.Например, если ваш класс Foo находится в пакете com.dummy.domain, вы должны добавить его в определение модуля.Подробнее здесь: http://code.google.com/webtoolkit/doc/latest/DevGuideOrganizingProjects.html#DevGuideInheritingModules
  6. Если вы включаете класс из другого проекта GWT, выпущенного как jar, убедитесь, что в jar также содержится исходный код, потому что GWT перекомпилирует также исходный код Java для классов, передаваемых клиенту.

Шрифт: http://isolasoftware.it/2011/03/22/gwt-serialization-policy-error/

1 голос
/ 09 января 2012

Я изучал выше, чтобы решить некоторый код GWT, написанный в 2008 году, при обновлении до GWT SDK 2.4.0 (с последней версией gxt * .jar) я получаю:

[WARN] adempiereService: An IncompatibleRemoteServiceException was thrown while processing this call.
com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException: com.google.gwt.user.client.rpc.SerializationException: Type 'org.idempiere.ui.gwt.client.util.AdempiereGXTUtil$LoginStage' was not included in the set of types which can be deserialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be deserialized.
    at com.google.gwt.user.server.rpc.RPC.decodeRequest(RPC.java:315)
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:206)

...

Caused by: com.google.gwt.user.client.rpc.SerializationException: com.google.gwt.user.client.rpc.SerializationException: Type 'org.idempiere.ui.gwt.client.util.AdempiereGXTUtil$LoginStage' was not included in the set of types which can be deserialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be deserialized.
at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamReader.deserialize(ServerSerializationStreamReader.java:581)

Этот пресловутый класс выглядит следующим образом (отредактировано в соответствии с идеями, приведенными в этой теме):

public class AdempiereGXTUtil {

    public enum LoginStage implements IsSerializable, Serializable {  
        LOGOUT,
        LOGIN,
        ISLOGGEDIN,
        ROLES,
        WRONGUSER,
        WRONGROLE;

        LoginStage(){
        }
    };

}

Думая о ответе Андрея , чтобы добавить тип в белый список, ноenum - это не новый myType, верно?В любом случае, здесь есть некоторая ссылка в кодовой базе (удалены не релевантные поля):

public interface AdempiereService extends RemoteService {

    public static final String SERVICE_URI = "adempiereService";

    public static class Util {

        public static AdempiereServiceAsync getInstance() {

            AdempiereServiceAsync instance = (AdempiereServiceAsync) GWT
                    .create(AdempiereService.class);
            return instance;
        }
    }

...     
    public LoginStage getLoginStage();

с:

public interface AdempiereServiceAsync {

...
    public void getLoginStage(AsyncCallback<LoginStage> callback);

Изначально AdempiereGXTUtil не реализовал IsSerializable, Serializable, не имеет пустого конструктора, нопоместив их выше, и очистка проекта в Eclipse не изменит тех же ошибок.Используемая версия Eclipse - Indigo на Java 1.6 в среде Mac Lion.Надеюсь получить больше от этой темы, которая, кстати, удивительна своей технической глубиной.

1 голос
/ 17 ноября 2010

Я думаю, вам нужен конструктор без аргументов.

0 голосов
/ 07 апреля 2017

Только имена констант перечисления сериализуются RPC GWT.Значения полей не сериализованы.

GWT: Связь с сервером: Сериализуемые типы

0 голосов
/ 29 апреля 2014

В этом случае Enum не может быть в классе.Вы должны создать внешний Enum.

0 голосов
/ 17 ноября 2010

a) Для сериализации вам определенно нужен конструктор без операции.

b) Вы можете расширить класс IsWerializable GWT или, если вы хотите использовать интерфейс сериализации Java, вы должны настроить политику, чтобы разрешить это.,Есть сообщение, связанное с этим на Как добавить тип в белый список политики сериализации GWT? .Кроме того, проверьте прицел GWT для получения дополнительной информации о IsSerializable против Serializable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...