RequestFactory with Collections of ValueProxy in a ValueProxy

118 views
Skip to first unread message

Alexandre Ardhuin

unread,
Jun 20, 2011, 3:59:31 PM6/20/11
to google-we...@googlegroups.com
Hi all,

I face a very strange behavior on requestFactory with GWT-2.3.
Sometimes, java.util.Set<T> collections are not deserialized as expected (java.util.List<T> works well). Some elements are missing.

Here's the code that illustrates the problem :

// ----------------------------------
// ----------- client side code
// ----------------------------------

@Service(value = MyService.class, locator = MyLocator.class)
public interface MyRequest extends RequestContext {
    Request<MyObjectProxy> getMyObject(int count);
}

@ProxyFor(value = MyObject.class)
public interface MyObjectProxy extends ValueProxy {
    int getExpectedSize();
    Set<StringContainerProxy> getStringContainers();
}

@ProxyFor(value = StringContainer.class)
public interface StringContainerProxy extends ValueProxy {
    String getString();
}

// ----------------------------------
// ------------ server side code
// ----------------------------------

public class MyLocator implements ServiceLocator {
    @Override
    public Object getInstance(final Class<?> clazz) { return new MyService(); }
}

public class MyService {
    public MyObject getMyObject(int count) {
        final Set<StringContainer> stringContainers = new HashSet<StringContainer>();
        for (int i = 0; i < count; i++) {
            stringContainers.add(new StringContainer(String.valueOf(i)));
        }
        return new MyObject(stringContainers.size(), stringContainers);
    }
}

public class MyObject {
    private final int expectedSize;
    private final Set<StringContainer> stringContainers;

    public MyObject(int expectedSize, Set<StringContainer> stringContainers) { this.expectedSize = expectedSize; this.stringContainers = stringContainers; }
    public int getExpectedSize() { return expectedSize; }
    public Set<StringContainer> getStringContainers() { return stringContainers; }
}

public class StringContainer {
    private final String string;

    public StringContainer(String string) { this.string = string; }
    public String getString() { return string; }
}


// ----------------------------------
// ------------ entry point that show different sizes
// ----------------------------------

public class MainPage implements EntryPoint {
    public void onModuleLoad()
    {
        final ClientFactory clientFactory = GWT.create(ClientFactory.class);
        clientFactory.init();
        call(clientFactory, 0);
    }

    private void call(final ClientFactory clientFactory, final int i)
    {
        if (i > 100) {
            return;
        }
        clientFactory.getRequestFactory().myRequest().getMyObject(i).fire(new Receiver<MyObjectProxy>() {
            @Override
            public void onSuccess(MyObjectProxy response) {
                RootPanel.get().add(new HTML(response.getExpectedSize() + " " + response.getStringContainers().size()));
                call(clientFactory, i + 1);
            }
        });
    }
}

Here's the results for the 30 first requests (left is the expected size, right is the real size) :
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
11 11
12 4  // problems start here...
13 4
14 4
15 4
16 4
17 4
18 4
19 4
20 4
21 4
22 4
23 9
24 10
25 11
26 12
27 13
28 14
29 14
30 14


Using java.util.List instead of java.util.Set resolves the problem.

Did i miss something ?

Alexandre.

Alexandre Ardhuin

unread,
Jun 21, 2011, 3:30:04 AM6/21/11
to google-we...@googlegroups.com

Daghan

unread,
Aug 7, 2011, 5:26:05 PM8/7/11
to google-we...@googlegroups.com
Hi Alexandre,

Thanks for posting this link. I've wasted my whole weekend on this issue
Reply all
Reply to author
Forward
0 new messages