web-dev-qa-db-fra.com

GWT - exception de sérialisation RPC

Cela fait longtemps que je fais GWT et j'avais besoin de faire quelque chose de petit, vite fait. J'ai mis les choses en place et j'ai maintenant un RPC dont j'ai besoin, mais il échoue.

Le RPC est censé me donner une ArrayList, et Vacancy se trouve dans # projectname # .client.model. L'appel est effectué dans # nomprojet # .client.model.
Les interfaces de mes services se trouvent dans # projet # nom.client.Service.
Enfin, les appels vont bien sûr à # nomprojet # .serveur.
Vacancy implémente IsSerializable. L'exception que je reçois en exécutant mon RPC est la suivante:

Starting Jetty on port 8888
[WARN] Exception while dispatching incoming RPC call
com.google.gwt.user.client.rpc.SerializationException: Type 'firsteight.client.model.Vacancy' 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 = firsteight.client.model.Vacancy@15fdd2f
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.Java:619)
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.Java:126)
    at com.google.gwt.user.client.rpc.core.Java.util.Collection_CustomFieldSerializerBase.serialize(Collection_CustomFieldSerializerBase.Java:44)
    at com.google.gwt.user.client.rpc.core.Java.util.ArrayList_CustomFieldSerializer.serialize(ArrayList_CustomFieldSerializer.Java:39)
    at com.google.gwt.user.client.rpc.core.Java.util.ArrayList_CustomFieldSerializer.serializeInstance(ArrayList_CustomFieldSerializer.Java:51)
    at com.google.gwt.user.client.rpc.core.Java.util.ArrayList_CustomFieldSerializer.serializeInstance(ArrayList_CustomFieldSerializer.Java:28)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.Java:740)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.Java:621)
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.Java:126)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter$ValueWriter$8.write(ServerSerializationStreamWriter.Java:153)
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeValue(ServerSerializationStreamWriter.Java:539)
    at com.google.gwt.user.server.rpc.RPC.encodeResponse(RPC.Java:616)
    at com.google.gwt.user.server.rpc.RPC.encodeResponseForSuccess(RPC.Java:474)
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.Java:571)
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.Java:208)
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.Java:248)
    at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.Java:62)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.Java:487)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.Java:362)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.Java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.Java:181)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.Java:729)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.Java:405)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.Java:152)
    at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.Java:49)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.Java:152)
    at org.mortbay.jetty.Server.handle(Server.Java:324)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.Java:505)
    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.Java:843)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.Java:647)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.Java:211)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.Java:380)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.Java:395)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.Java:488)

Le RPC que je fais est le suivant:

void getVacs() {
    try {
        homeService.getVacancies(new AsyncCallback<ArrayList<Vacancy>>() {
            public void onFailure(Throwable caught)
            {
                RootPanel.get("grayblock").add(new HTML("Failed:" + caught.getMessage()));
            }

            public void onSuccess(ArrayList<Vacancy> result)
            {
                RootPanel.get("grayblock").add(new HTML(result.get(0).getTitle()));
            }
        });
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

Je pensais que j'avais fait tout ce dont j'avais besoin pour rendre Vacancy sérialisable et qu'une ArrayList of Vacancy comme type de retour pour le RPC est considérée comme ayant Vacancy comme type de retour .. non? Qu'est-ce que je fais mal?

Merci d'avance!

13
Mark Tielemans

Cela est normalement dû à l'utilisation d'une classe non sérialisable, ce qui peut se produire si votre classe n'implémente pas com.google.gwt.user.client.rpc.IsSerializable ou si vous avez oublié d'ajouter un constructeur vide.

Pour réussir un haricot, vous devez remplir les conditions suivantes (à partir du site GWT):

  1. Il implémente l'interface Java Serializable ou GWT IsSerializable, soit directement, soit parce qu'il dérive d'une super-classe qui le fait.
  2. Ses champs d'instance non définitifs, non transitoires sont eux-mêmes sérialisables
  3. Il a un constructeur par défaut (zéro argument) avec n’importe quel modificateur d’accès (par exemple, private Foo () {} fonctionnera)

Même si vous remplissez ces conditions, le compilateur GWT peut dire:

n'a pas été inclus dans l'ensemble des types pouvant être sérialisés par ce SerializationPolicy ou son objet Class n'a pas pu être chargé. Pour des raisons de sécurité, ce type ne sera pas sérialisé.: Instance = @

Le problème peut avoir différentes causes. Voici une liste de contrôle complète à utiliser pour résoudre le problème:

  1. Vérifier que la classe a un constructeur par défaut (sans arguments)
  2. Vérifier que la classe implémente Serializable ou IsSerializable ou une interface qui étend Serializable ou une classe qui implémente Serializable
  3. Vérifiez que la classe est dans un package client. * Ou…
  4. Vérifiez, si la classe n'est pas dans le package client. *, Qu'elle est compilée dans la définition de votre module GWT xml. Par défaut est présent. Si votre classe est dans un autre package, vous devez l'ajouter à la source. Par exemple, si votre classe est sous domaine. *, Vous devez l’ajouter à xml en tant que. Sachez que la classe ne peut pas appartenir au package du serveur! Plus de détails sur la page GWT: http://code.google.com/webtoolkit/doc/latest/DevGuideOrganizingProjects.html#DevGuideModuleXml
  5. Si vous incluez la classe d'un autre projet GWT, vous devez ajouter les héritages à la définition de votre module XML. Par exemple, si votre classe Foo est dans le package com.dummy.domain, vous devez l'ajouter à la définition du module. Plus de détails ici: http://code.google.com/webtoolkit/doc/latest/DevGuideOrganizingProjects.html#DevGuideInheritingModules
  6. Si vous incluez la classe d'un autre projet GWT publié en tant que jar, vérifiez que le jar contient également le code source car GWT recompile également le code source Java des classes transmises au client.

PS: copié à partir de http://isolasoftware.it/2011/03/22/gwt-serialization-policy-error/ car le site est indisponible actuellement. Si vous souhaitez lire l'article d'origine, recherchez-le dans Google à l'aide de l'URL ci-dessus et lisez-le dans le cache Web de Google.

32
Õzbek

Une autre raison de cette exception était le javascript obsolète côté navigateur. Je devais recharger (CTRL + F5) le code et cette exception avait disparu.

6
Cipous

Tout d’abord, assurez-vous d’avoir défini un constructeur vide .
Sinon, votre classe ne sera pas sérialisable ...

Si vous avez un constructeur vide, assurez-vous que votre classe (ou toute classe de la chaîne extend) implémente IsSerializable (ou toute autre interface qui étend IsSerialisable).

Si votre classe implémente IsSerialisable, vérifiez que c'est non-final ...

0
balt

J'ai aussi cette erreur quand j'ai utilisé la sous-liste:

return myList.subList(fromIndex, toIndex);
0
paka

Dans mon cas, il existe dans mon dossier target un ancien cache qui n'a pas été correctement mis à jour. Je devais reconstruire le projet (Maven -> Update Project) et ensuite cela fonctionnait.

0
xji