开发者

GWT serialization of a subclass

开发者 https://www.devze.com 2023-01-14 09:20 出处:网络
I have RPC service that returns an object of type GameEvent that extends from Event (abstract). When I get the object on the client

I have RPC service that returns an object of type GameEvent that extends from Event (abstract). When I get the object on the client side, all the properties inherited from Event (eventId, copyEventId, gameTimeGMT) are set to null whereas on the server side, these properties have values.

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: I use the gwt-platform framework (MVP implementation). Here is the call to the service client side. The result.getGE() returns the GameEvent object but with null properties.

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

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

The Result:

public class GetFormattedEventResult implements Result {

    private GameEvent e;

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

    public GetFormattedEventResult(GameEvent gameEvent) {
开发者_StackOverflow社区        e = gameEvent;
    }

    public GameEvent getGE() {
        return e;
    }
}


I'll try to take a stab.

Verify that the Event class is in the GWT serialization whitelist (the .gwt.rpc file that is generated for each service interface). If it's not, you may have to trick GWT into adding it.

0

精彩评论

暂无评论...
验证码 换一张
取 消