sérialisation GWT d'une sous-classe
-
01-10-2019 - |
Question
J'ai service RPC qui retourne un objet de type GameEvent que
étend de l'événement (résumé). Quand je reçois l'objet sur le client
latérales, toutes les propriétés héritées de l'événement (eventId, copyEventId,
gameTimeGMT) sont fixés à null
tandis que sur le côté serveur, ceux-ci
propriétés ont des valeurs.
public class GameEvent extends Event implements IsSerializable {
private String homeTeam;
private String awayTeam;
public GameEvent() {
}
}
// Annotation are from the twig-persist framework which should not
// impact the serialization process.
public abstract class Event implements IsSerializable {
@Key
protected String eventId;
@Index
protected String copyEventId;
protected Date gameTimeGMT;
protected Event() {
}
}
Mise à jour: J'utilise le cadre GWT-plateforme (mise en œuvre MVP). Voici l'appel du côté client de service. Le result.getGE()
retourne l'objet GameEvent mais avec des propriétés null
.
dispatcher.execute(
new GetFormattedEventAction(
id),
new AsyncCallback<GetFormattedEventResult>() {
@Override
public void onFailure(Throwable caught) {
caught.printStackTrace();
}
@Override
public void onSuccess(
GetFormattedEventResult result) {
FormattedGameEvent formattedGameEvent = new FormattedGameEvent(
result.getGE());
}
});
Le gestionnaire d'action:
public class GetFormattedEventActionHandler implements
ActionHandler<GetFormattedEventAction, GetFormattedEventResult> {
@Override
public GetFormattedEventResult execute(GetFormattedEventAction action,
ExecutionContext context) throws ActionException {
GameEvent gameEvent = null;
QueryResultIterator<GameEvent> rs = datastore.find().type(
GameEvent.class).addFilter("copyEventId", FilterOperator.EQUAL,
action.getEventId()).returnResultsNow();
if (rs.hasNext()) {
gameEvent = rs.next();
}
return new GetFormattedEventResult(gameEvent);
}
}
Le résultat:
public class GetFormattedEventResult implements Result {
private GameEvent e;
@SuppressWarnings("unused")
private GetFormattedEventResult() {
}
public GetFormattedEventResult(GameEvent gameEvent) {
e = gameEvent;
}
public GameEvent getGE() {
return e;
}
}
La solution
Je vais essayer de prendre un coup de poignard.
Vérifiez que la classe de l'événement est dans la sérialisation GWT whitelist (le fichier .gwt.rpc
qui est généré pour chaque interface de service). Si ce n'est pas, vous pouvez avoir à GWT en ajoutant.