Alexandre Ardhuin
unread,Jun 20, 2011, 3:59:31 PM6/20/11Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
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.