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!
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):
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:
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.
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.
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 ...
J'ai aussi cette erreur quand j'ai utilisé la sous-liste:
return myList.subList(fromIndex, toIndex);
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.