2010-08-25 17 views
6

Ich habe RPC-Dienst, der ein Objekt vom Typ GameEvent zurückgibt, dass erstreckt sich von Event (Zusammenfassung). Wenn ich das Objekt auf der Clientseite bekomme, werden alle von Event geerbten Eigenschaften (eventId, copyEventId, gameTimeGMT) auf null gesetzt, während auf der Serverseite diese Eigenschaften Werte haben.GWT Serialisierung einer Unterklasse

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() { 
    } 
} 

Update: Ich verwende das gwt-Plattform-Framework (MVP-Implementierung). Hier ist der Aufruf zur Service-Client-Seite. Die result.getGE() gibt das GameEvent-Objekt aber mit null Eigenschaften zurück.

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()); 
      } 
     }); 

Der Action-Handler:

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); 
    } 
} 

Das Ergebnis:

public class GetFormattedEventResult implements Result { 

    private GameEvent e; 

    @SuppressWarnings("unused") 
    private GetFormattedEventResult() { 
    } 

    public GetFormattedEventResult(GameEvent gameEvent) { 
     e = gameEvent; 
    } 

    public GameEvent getGE() { 
     return e; 
    } 
} 

Antwort

0

Ich werde versuchen, einen Stich zu nehmen.

Überprüfen Sie, ob die Event-Klasse in der GWT-Serialisierungs-Whitelist enthalten ist (die .gwt.rpc-Datei, die für jede Service-Schnittstelle generiert wird). Wenn dies nicht der Fall ist, müssen Sie möglicherweise trick GWT hinzufügen.

+0

Aktualisiert die Frage. Habe auch versucht, GWT auszutricksen, aber es funktioniert nicht. – Sydney

+0

Das GameEvent hatte Eigenschaften eines Typs, der IsSerializable nicht implementiert hat, deshalb war es nicht in der Serialisierungs-Whitelist. – Sydney

+0

ahh, das macht Sinn. Entschuldigung, ich könnte nicht mehr Hilfe sein. Der GWTC hätte dies jedoch warnen müssen. –

Verwandte Themen