Nicht serialisieren eines Enum zu GWT

Ich bin nicht in der Lage zu serialisieren eines Enum zu GWT, wenn es implementiert java.io.Serializable. Es wird GWT erfolgreich kompiliert wird, aber zur Laufzeit bekomme ich die gefürchtete:

Type 'com....Sicherheit..AdminPrivilege' wurde nicht zugewiesen", Kom.google.gwt.Benutzer.client.rpc.IsSerializable' und nicht in ein benutzerdefiniertes Feld serializer.Aus Sicherheitsgründen, werden nicht serialisiert werden.: Instanz = Login an der Konsole

Wenn ich das implementieren von com.google.gwt.Benutzer.client.rpc.IsSerializable es kompiliert und läuft einwandfrei. Ich versuche zu vermeiden, IsSerializable, da diese Enum-ist beharrlich in unsere DB und wird in nicht-GWT-servlets. Ich will nicht die Einführung einer GWT-Abhängigkeit, auch für die einzelne Klasse.

Ich gelesen habe, die meisten Diskussionen zu diesem Thema hier. Ich habe:

  1. Hinzugefügt serialVersionUid (was nicht notwendig sein sollte)
  2. Hinzugefügt ein no-arg-Konstruktor (aber das ist ein Enum, also muss es privat sein - ich vermute das, das problem sein kann)
  3. Hinzugefügt callable RPC-Methode liefert den Enum und nimmt eine Reihe von Enum als input-argument (versucht man diese Enum in der whitelist) -

Für alle anderen Enumerationen, generiert ich ein GWT-version, die implementiert IsSerializable. Aber diese neue Enum ist zu Komplex, zu generieren und zu brauche ich die Methoden von Enum in der GWT-code.

Vielen Dank für jede Hilfe auf diesem.

Mein Enum ist unten. Feststellen, es hat eine integrierte Enum:

public enum AdminPrivilege implements java.io.Serializable {

    //Privileges
    MANAGE_XX("Manage XX", PrivilegeCategory.XX), 
    IMPORT_LICENSE("Import a License", PrivilegeCategory.XX), 
    SUBMIT_BUG("Submit a Bug", PrivilegeCategory.XX), 
    TEST_AD("Test AD", PrivilegeCategory.XX),

    //Administrator Privileges
    LOGIN("Login to XX", PrivilegeCategory.ADMIN), 
    MANAGE_ADMIN("Manage Administrators", PrivilegeCategory.ADMIN), 
    MANAGE_ROLE("Manage Roles", PrivilegeCategory.ADMIN),

    //Task Privileges
    CANCEL_TASK("Cancel Tasks", PrivilegeCategory.TASK), ;

    private static final long serialVersionUID = 1L;

    /**
     * Defines the privilege categories.
     * 
     */
    public enum PrivilegeCategory implements java.io.Serializable {

        XX("XX"), 
        ADMIN("Administrator"), 
        TASK("Task"), ;

        private static final long serialVersionUID = 2L;

        private String displayValue;

        //This constructor is required for GWT serialization
        private PrivilegeCategory() {
        }

        private PrivilegeCategory(String displayValue) {
            this.displayValue = displayValue;
        }

        @Override
        public String toString() {
            return displayValue;
        }
    }

    private String displayValue;
    private AdminPrivilege parentPrivilege;
    private PrivilegeCategory privilegeCategory;

    //This constructor is required for GWT serialization
    private AdminPrivilege() {
    }

    private AdminPrivilege(String displayValue, PrivilegeCategory category) {
        this.displayValue = displayValue;
        this.privilegeCategory = category;
    }

    private AdminPrivilege(String displayValue, PrivilegeCategory category, AdminPrivilege parent) {
        this(displayValue, category);
        this.parentPrivilege = parent;
    }

    /**
     * Return the parent privilege for this privilege.
     * 
     * @return
     */
    public AdminPrivilege getParentPrivilege() {
        return parentPrivilege;
    }

    /**
     * Return the category for this privilege.
     * 
     * @return
     */
    public PrivilegeCategory getPrivilegeCategory() {
        return privilegeCategory;
    }

    /**
     * Return the set of categories.
     * 
     * @return
     */
    public static Set<PrivilegeCategory> getPrivilegeCategories() {
        Set<PrivilegeCategory> category = new HashSet<PrivilegeCategory>();
        for (PrivilegeCategory c : PrivilegeCategory.values()) {
            category.add(c);
        }
        return category;
    }

    /**
     * Return the set of privileges for a category.
     * 
     * @return
     */
    public static Set<AdminPrivilege> getPrivileges(PrivilegeCategory category) {
        Set<AdminPrivilege> privileges = new HashSet<AdminPrivilege>();
        for (AdminPrivilege p : AdminPrivilege.values()) {
            if (category.equals(p.getPrivilegeCategory())) {
                privileges.add(p);
            }
        }
        return privileges;
    }

    /**
     * Return the set of child privileges for a specific privilege
     * 
     * @param parent
     * @return
     */
    public static Set<AdminPrivilege> getChildPrivileges(AdminPrivilege parent) {
        Set<AdminPrivilege> children = new HashSet<AdminPrivilege>();
        for (AdminPrivilege priv : values()) {
            if (parent.equals(priv.getParentPrivilege())) {
                children.add(priv);
            }
        }
        return children;
    }

    /**
     * Return the set of privileges that are parent privileges
     * 
     * @return
     */
        public static Set<AdminPrivilege> getParentPrivileges() {
            Set<AdminPrivilege> parents = new HashSet<AdminPrivilege>();
            for (AdminPrivilege priv : values()) {
                if (priv.getParentPrivilege() == null) {
                    parents.add(priv);
                }
            }
            return parents;
        }

    }

}
  • Das ist wirklich seltsam. Ein einfaches enum sollte serialisierbar sein, standardmäßig mit keine änderungen. Posten Sie Ihre enum-code.
  • Gut - es ist nicht ein einfaches Enum - es hat eine eingebettete Enum. Hier ist es:
  • genau dieses enum funktioniert gut für mich unter gwt 2.3.0 - mehr code-Kontext?
  • Sorry, ich habe die version mit den IsSerializable (die funktioniert bei mir auch). Ich bin versucht, es zu erhalten, um die Arbeit mit java.io.Serializable. Ich modifiziert habe meinen post korrigieren.
  • mein Kommentar bleibt der gleiche. funktioniert gut in gwt 2.3.0 - Kontext?
  • Es gibt deutlich mehr Enumerationen definiert (~40), aber das sollte nichts ändern. Ich bin versucht zu serialisieren eines java.util.Satz von Ihnen innerhalb einer Administrator-Objekt, das hat auch einen Namen und eine Beschreibung Zeichenfolge-Eigenschaft. Ich habe einen dummy-Dienst-Methode versuchen, um dies in GWT whitelist hinzu. Diese dummy-Methode zurückgegeben, die den Enum und nahm ein Enum als input arg. Ich habe nie versucht, Sie anzurufen, dies zu sehen, wenn ich könnte es zu serialisieren allein.
  • kann ich nicht reproduzieren diesen Fehler, egal was ich mache. können Sie ein code snipped, wo Sie versuchen, zu serialisieren eines administrator-Objekt?
  • Ich verwende den folgenden code zum erstellen des proxy-Objekts (AdminRoleGWT), die für die AdminRole-Objekt, das enthält eine Reihe von AdminPrivileges: public static AdminRoleGWT summarize(AdminRole role) { AdminRoleGWT roleGWT = new AdminRoleGWT( role.getDescription(), role.getAllowPrivileges(), AdminRoleTypeGWT.valueOfDisplayValue(role.getType().toString()), role.getName(), role.getId() ); return roleGWT; }
  • seltsam. und was tun Sie mit dieser AdminRoleGWT?
  • Ich kehre es aus meiner ServiceImpl-Klasse:` @Override public AdminRoleGWT getAdminRole(java.lang.Long id, java.lang.String tx) { AdminRole adminRole = adminManager.getAdminRole(id, tx); return (AdminRoleGWT)GWTFactory.summarizeObject(adminRole); } `
  • Enumerationen, die sich nicht an die gleiche Serialisierung Regeln als Klassen im GWT, denn Sie sind nicht Klassen. Sie brauchen keine Argumente Konstruktoren oder bei der Implementierung von Serializable oder IsSerializable. Enumerationen, werden serialisiert, indem Sie Ihre code-Werte. Ihre enum ist in Ordnung. Die Postleitzahl von AdminRoleGWT Klasse bitte. Und alle Klassen, die AdminRoleGWT verwendet.
  • AdminRoleGWT ist einer der vielen proxy-Klassen generieren wir für GWT serialisiert. Es ist ein einfaches POJO mit Getter und setter mit den folgenden Eigenschaften: String description, Set<AdminPrivilege> allowPrivileges, AdminRoleTypeGWT-Typ; <br/>AdminRoletType ist eine generierte Enum - eine einfachere, die wir generieren.
  • noch ist nicht reproduzierbar für mich - die gwt-version verwenden Sie?
  • Ich habe einen ähnlichen Fehler mit einer statischen inneren Klasse. Ich wusste nicht, das problem einzugrenzen, also bin ich nicht der Buchung eine Antwort, sondern setzen Sie die geschachtelte Klasse, die außerhalb der äußeren Klasse gelöst. Es verwendet, um die Arbeit vorher, aber ich hielt das hinzufügen von Feldern und brach irgendwann; nicht sicher, was die Ursache sein könnte.

InformationsquelleAutor PeterD | 2011-11-08
Schreibe einen Kommentar