RPC enhancement suggestion

168 views
Skip to first unread message

Ian Petersen

unread,
Aug 14, 2008, 10:36:49 AM8/14/08
to Google Web Toolkit Contributors
Hi list,

In dealing with an issue on the developers' forum, I had an idea I
thought I'd float by before filing an issue.

A frequent problem on the developer forum is "I want to return a
List<Object> over RPC--the list will only ever contain Integers,
Longs, Dates, or Strings, but they don't share a common super type
besides Object so GWT is getting in my way." The usual answer is
"introduce a new type", which works but is an egregious pain. What if
you could do this, instead:

public class DTO implements Serializable {

@PossibleTypes(String.class, Integer.class, Long.class, Date.class)
private Object value;
}

The intended semantics is that DTO.value's type will only ever be one
of {String, Integer, Long, Date} or a subtype thereof and, since all
those types are serializable, DTO is itself serializable.

I suppose there's a downside here: there's a loss of static typing
information because it's still legal Java to assign any Object to
DTO.value but doing so would have to cause an exception when the DTO
instance is serialized. I think the increased flexibility is worth it
in this case.

Something else to consider is what to do with parameterized types.
You would need to be able to describe the possible subtypes of both
the parameterized type and the type parameters, like so:

public interface ServiceInterface {

@PossibleTypes(ArrayList.class, CustomList.class)
// how do I constrain Object?
List<Object> getList();

// how do I constrain each Object independently?
HashMap<Object, Object> getMap();
}

I suppose you could change the name to @ConstrainType and add
@ConstrainParameters, which would take an array of @ConstrainType
annotations, like this:

@ConstrainType(HashMap.class)
@ConstrainParameters({
@ConstrainType(String.class, Date.class),
@ConstrainType(Integer.class, Long.class)
})
Map<Object, Object> foo;

The above is supposed to describe a map from (String U Date) ->
(Integer U Long).

Thoughts?

Ian

Scott Blum

unread,
Aug 14, 2008, 1:48:53 PM8/14/08
to Google-Web-Tool...@googlegroups.com
You don't need new features to accomplish this...

class DTO implements IsSerializable {
  private Date exposeDateType;
  private Long exposeLongType;
  private String exposeStringType;
  private final transient Object value;

  public DTO(Date value) {
    this.value = value;
  }

  public DTO(Long value) {
    this.value = value;
  }

  public DTO(String value) {
    this.value = value;
  }

  /**
   * For serialization.
   */
  DTO(Object value) {
    this.value = value;
  }

  public Object getValue() {
    return value;
  }
}

class DTO_CustomFieldSerializer {
  public static void deserialize(SerializationStreamReader streamReader,
      DTO instance) throws SerializationException {
    // Handled in instantiate.
  }

  public static DTO instantiate(SerializationStreamReader streamReader)
      throws SerializationException {
    return new DTO(streamReader.readObject());
  }

  public static void serialize(SerializationStreamWriter streamWriter,
      DTO instance) throws SerializationException {
    streamWriter.writeObject(instance.getValue());

Martin

unread,
Aug 20, 2008, 1:51:09 AM8/20/08
to Google Web Toolkit Contributors

mjfan80

unread,
Aug 22, 2008, 10:20:02 AM8/22/08
to Google Web Toolkit Contributors
I just try to to that (but putting the class DTO as "public class"...
otherwise was not compiling)
but i get this runtime error, while server was trying to serialize the
class

com.google.gwt.user.client.rpc.SerializationException:
java.lang.reflect.InvocationTargetException
at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeWithCustomSerializer(ServerSerializationStreamWriter.java:
424)
at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.java:
384)
at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:
333)
at
com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:
81)
at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeValue(ServerSerializationStreamWriter.java:
259)
at com.google.gwt.user.server.rpc.RPC.encodeResponse(RPC.java:
574)
at
com.google.gwt.user.server.rpc.RPC.encodeResponseForSuccess(RPC.java:
442)
at
com.google.gwt.user.server.rpc.RPC.encodeResponseForSuccess(RPC.java:
385)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
25)
at java.lang.reflect.Method.invoke(Method.java:597)
at
org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:
86)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:230)
at
groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1105)
at
groovy.lang.ExpandoMetaClass.invokeStaticMethod(ExpandoMetaClass.java:
957)
at
org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:
749)
at
org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN(ScriptBytecodeAdapter.java:
170)
at
org.codehaus.groovy.grails.plugins.gwt.GrailsRemoteServiceServlet.processCall(GrailsRemoteServiceServlet.groovy:
54)
at
com.google.gwt.user.server.rpc.RemoteServiceServlet.doPost(RemoteServiceServlet.java:
187)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:
727)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:
820)
at
org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
at org.mortbay.jetty.servlet.ServletHandler
$CachedChain.doFilter(ServletHandler.java:1098)
at
org.codehaus.groovy.grails.web.mapping.filter.UrlMappingsFilter.processFilterChain(UrlMappingsFilter.java:
157)
at
org.codehaus.groovy.grails.web.mapping.filter.UrlMappingsFilter.doFilterInternal(UrlMappingsFilter.java:
74)
at
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:
75)
at org.mortbay.jetty.servlet.ServletHandler
$CachedChain.doFilter(ServletHandler.java:1089)
at
org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter.parsePage(GrailsPageFilter.java:
123)
at
org.codehaus.groovy.grails.web.sitemesh.GrailsPageFilter.doFilter(GrailsPageFilter.java:
86)
at org.mortbay.jetty.servlet.ServletHandler
$CachedChain.doFilter(ServletHandler.java:1089)
at
org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:
65)
at
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:
75)
at org.mortbay.jetty.servlet.ServletHandler
$CachedChain.doFilter(ServletHandler.java:1089)
at
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:
96)
at
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:
75)
at
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:
183)
at
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:
138)
at org.mortbay.jetty.servlet.ServletHandler
$CachedChain.doFilter(ServletHandler.java:1089)
at
org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:
365)
at
org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:
216)
at
org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:
181)
at
org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:
712)
at
org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
at
org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:
139)
at org.mortbay.jetty.Server.handle(Server.java:295)
at
org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:
503)
at org.mortbay.jetty.HttpConnection
$RequestHandler.content(HttpConnection.java:841)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:639)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:
210)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:
379)
at
org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:
361)
at org.mortbay.thread.BoundedThreadPool
$PoolThread.run(BoundedThreadPool.java:442)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
25)
at java.lang.reflect.Method.invoke(Method.java:597)
at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeWithCustomSerializer(ServerSerializationStreamWriter.java:
409)
... 52 more
Caused by: com.google.gwt.user.client.rpc.SerializationException:
java.lang.IllegalAccessException: Class
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter
can not access a member of class
client.dominio.DTO_CustomFieldSerializer with modifiers "public
static"
at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeWithCustomSerializer(ServerSerializationStreamWriter.java:
421)
at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.java:
384)
at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:
333)
at
com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:
81)
at
com.google.gwt.user.client.rpc.core.java.util.ArrayList_CustomFieldSerializer.serialize(ArrayList_CustomFieldSerializer.java:
46)
... 57 more
Caused by: java.lang.IllegalAccessException: Class
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter
can not access a member of class
client.dominio.DTO_CustomFieldSerializer with modifiers "public
static"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:
65)
at java.lang.reflect.Method.invoke(Method.java:588)
at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeWithCustomSerializer(ServerSerializationStreamWriter.java:
409)
... 61 more

mjfan80

unread,
Aug 22, 2008, 9:53:10 AM8/22/08
to Google Web Toolkit Contributors
Hi to all

i just try what you proposed..
first, i had to modify the DTO class with the modifier
public

then i get this error when the server try to serialize the DTO class

Sumit Chandel

unread,
Aug 22, 2008, 2:21:43 PM8/22/08
to Google Web Toolkit Contributors, mme...@google.com
There seems to be a lot of interest for this annotation-based way to
support List<Object> myList declarations that can be used for
seralization across the wire.

Issue #1833 should be updated if we decide to pick this up:

http://code.google.com/p/google-web-toolkit/issues/detail?id=1833

Cheers,
-Sumit Chandel
> ...
>
> read more »

Miguel Méndez

unread,
Aug 22, 2008, 2:48:39 PM8/22/08
to Sumit Chandel, Bob Vawter, Google Web Toolkit Contributors
[+bobv - new keeper of RPC]
--
Miguel

Scott Blum

unread,
Aug 22, 2008, 4:00:02 PM8/22/08
to Google-Web-Tool...@googlegroups.com
This is kind of weird:

Caused by: com.google.gwt.user.client.rpc.SerializationException: java.lang.IllegalAccessException: Class com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter can not access a member of class client.dominio.DTO_CustomFieldSerializer with modifiers "public static"

Sounds like an odd Java permissions thing.  I'd try debugging it.

Toby Reyelts

unread,
Aug 22, 2008, 5:20:17 PM8/22/08
to Google-Web-Tool...@googlegroups.com
Is his CustomFieldSerializer not a public class? If we're not using setAccessible to get at it, then you could get this error in that case.

mjfan80

unread,
Aug 26, 2008, 3:03:17 AM8/26/08
to Google Web Toolkit Contributors
if my DTO_CustomFieldSerializer is declare as Scott write in his post,
i get the error i wrote before
if i set the class public i get this error NoSuchMethodException

this is my class

package client.dominio;

import com.google.gwt.user.client.rpc.SerializationException;
import com.google.gwt.user.client.rpc.SerializationStreamReader;
import com.google.gwt.user.client.rpc.SerializationStreamWriter;

public class DTO_CustomFieldSerializer {
public static void deserialize(SerializationStreamReader
streamReader, DTO instance) throws SerializationException {
// Handled in instantiate.
}

public static DTO instantiate(SerializationStreamReader
streamReader)
throws SerializationException {
return new DTO(streamReader.readObject());
}

public static void serialize(SerializationStreamWriter
streamWriter, client.dominio.DTO instance) throws
SerializationException {
streamWriter.writeObject(instance.getValue());
java.lang.NoSuchMethodException:
client.dominio.DTO_CustomFieldSerializer.serialize(com.google.gwt.user.client.rpc.SerializationStreamWriter,
client.dominio.DTO)
at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeWithCustomSerializer(ServerSerializationStreamWriter.java:
415)
at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.java:
384)
at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:
333)
at
com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:
81)
at
com.google.gwt.user.client.rpc.core.java.util.ArrayList_CustomFieldSerializer.serialize(ArrayList_CustomFieldSerializer.java:
46)
... 57 more
Caused by: java.lang.NoSuchMethodException:
client.dominio.DTO_CustomFieldSerializer.serialize(com.google.gwt.user.client.rpc.SerializationStreamWriter,
client.dominio.DTO)
at java.lang.Class.getMethod(Class.java:1605)
at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeWithCustomSerializer(ServerSerializationStreamWriter.java:
406)
... 61 more
2008-08-26 08:51:41.392:/TestHibernate:WARN: Exception while
dispatching incoming RPC call
com.google.gwt.user.server.rpc.UnexpectedException: Service method
'public abstract java.util.ArrayList
client.ProvaDTOService.elencaChiamate()' threw an unexpected
exception: com.google.gwt.user.client.rpc.SerializationException:
java.lang.reflect.InvocationTargetException
at
com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:
361)
at
com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:
320)
58)
Caused by: com.google.gwt.user.client.rpc.SerializationException:
... 34 more
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
25)
at java.lang.reflect.Method.invoke(Method.java:597)
at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeWithCustomSerializer(ServerSerializationStreamWriter.java:
409)
... 52 more
Caused by: com.google.gwt.user.client.rpc.SerializationException:
java.lang.NoSuchMethodException:
client.dominio.DTO_CustomFieldSerializer.serialize(com.google.gwt.user.client.rpc.SerializationStreamWriter,
client.dominio.DTO)
at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeWithCustomSerializer(ServerSerializationStreamWriter.java:
415)
at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.java:
384)
at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:
333)
at
com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:
81)
at
com.google.gwt.user.client.rpc.core.java.util.ArrayList_CustomFieldSerializer.serialize(ArrayList_CustomFieldSerializer.java:
46)
... 57 more
Caused by: java.lang.NoSuchMethodException:
client.dominio.DTO_CustomFieldSerializer.serialize(com.google.gwt.user.client.rpc.SerializationStreamWriter,
client.dominio.DTO)
at java.lang.Class.getMethod(Class.java:1605)
at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeWithCustomSerializer(ServerSerializationStreamWriter.java:
406)
... 61 more

mjfan80

unread,
Aug 26, 2008, 9:52:04 AM8/26/08
to Google Web Toolkit Contributors
Every error and behavior i wrote before was inside a Grails+gwt
framework... so i thought that maybe the error i get was something
about the grails/spring fremwork that was trying to do something

so i set up a pure gwt module and test the scott solution
now i get a new kind of error

this the classes i use



/* CLASS fdlservizi.prova.client.dominio.DTO*/
import java.util.Date;
import com.google.gwt.user.client.rpc.IsSerializable;

public class DTO implements IsSerializable {
private Date exposeDateType;
private Long exposeLongType;
private String exposeStringType;
private final transient Object value;

public DTO(Date value) {
this.value = value;
}

public DTO(Long value) {
this.value = value;
}

public DTO(String value) {
this.value = value;
}

/**
* For serialization.
*/
public DTO(Object value) {
this.value = value;
}

public Object getValue() {
return value;
}

}



/* CLASS fdlservizi.prova.client.dominio.DTO_CustomFieldSerializer*/
import com.allen_sauer.gwt.log.client.Log;
import com.google.gwt.user.client.rpc.SerializationException;
import com.google.gwt.user.client.rpc.SerializationStreamReader;
import com.google.gwt.user.client.rpc.SerializationStreamWriter;

public class DTO_CustomFieldSerializer {
public static void deserialize(SerializationStreamReader
streamReader, DTO instance) throws SerializationException {
Log.debug("deserialize partito");
// Handled in instantiate.
}

public static DTO instantiate(SerializationStreamReader
streamReader)
throws SerializationException {
Log.debug("instantiate partito");
return new DTO(streamReader.readObject());
}

public static void serialize(SerializationStreamWriter
streamWriter, DTO instance) throws SerializationException {
Log.debug("serialize partito; instance = " + instance);
streamWriter.writeObject(instance.getValue());
}
}



/* CLASS DTO_CustomFieldSerializer.DatiChiamata*/
/* That's the object i want to try to include inside the dto object,
is a pojo dto*/
import com.google.gwt.user.client.rpc.IsSerializable;
import java.util.Date;

public class DatiChiamata implements IsSerializable {
public String id;
public String apertaDa;
[...]
public String descrImpianto;
public String nome;
public String cognome;
[...]
}



/* CLASS fdlservizi.prova.client.RPCService */
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;

public class RPCService implements RPCInterfaceAsync
{
RPCInterfaceAsync service = (RPCInterfaceAsync)
GWT.create(RPCInterface.class);
ServiceDefTarget endpoint = (ServiceDefTarget) service;

public RPCService()
{
com.google.gwt.core.client.GWT.log("url: " +
GWT.getModuleBaseURL(),null);
endpoint.setServiceEntryPoint(GWT.getModuleBaseURL() + "rpc");
}
public void testRPC(String message, AsyncCallback callback)
{
service.testRPC(message, callback);
}

public void testDTO(AsyncCallback callback){
service.testDTO(callback);
}
}



/* CLASS RPCService .RPCInterfaceAsync */
import com.google.gwt.user.client.rpc.AsyncCallback;

public interface RPCInterfaceAsync {
void testRPC(String message, AsyncCallback callback);
void testDTO(AsyncCallback callback);
}



/* CLASS fdlservizi.prova.client.RPCService */
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;

public class RPCService implements RPCInterfaceAsync
{
RPCInterfaceAsync service = (RPCInterfaceAsync)
GWT.create(RPCInterface.class);
ServiceDefTarget endpoint = (ServiceDefTarget) service;

public RPCService()
{
com.google.gwt.core.client.GWT.log("url: " +
GWT.getModuleBaseURL(),null);
endpoint.setServiceEntryPoint(GWT.getModuleBaseURL() + "rpc");
}
public void testRPC(String message, AsyncCallback callback)
{
service.testRPC(message, callback);
}

public void testDTO(AsyncCallback callback){
service.testDTO(callback);
}
}



/* and that's is the entrypoint*/
/* the rpc inside the second button is working good*/
/* that's is the output i get on the console*/
/* ============= gwt-log-1.5.6 =============Tue Aug 26 15:33:48 CEST
2008=============
[DEBUG] bottone 3 cliccato
26-ago-2008 15.33.49 com.allen_sauer.gwt.log.server.ServerLogImplJDK14
debug
FINE: [DEBUG] bottone 3 cliccato
26-ago-2008 15.33.49 com.allen_sauer.gwt.log.server.ServerLogImplJDK14
debug
FINE: testDTO partito (LOG)
26-ago-2008 15.33.49 com.allen_sauer.gwt.log.server.ServerLogImplJDK14
info
INFO: ============= gwt-log-1.5.6 =============Tue Aug 26 15:33:48
CEST 2008=============
26-ago-2008 15.33.49 com.allen_sauer.gwt.log.server.ServerLogImplJDK14
debug
FINE: datichiamata settato
26-ago-2008 15.33.49 com.allen_sauer.gwt.log.server.ServerLogImplJDK14
debug
FINE: dto settato
26-ago-2008 15.33.49 com.allen_sauer.gwt.log.server.ServerLogImplJDK14
debug
FINE: serialize partito; instance =
fdlservizi.prova.client.dominio.DTO@2f996f
*/
/* CLASS fdlservizi.prova.client.ProvaDTO */
import fdlservizi.prova.client.RPCService;
import fdlservizi.prova.client.dominio.DTO;
import fdlservizi.prova.client.dominio.DatiChiamata;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.allen_sauer.gwt.log.client.Log;

public class ProvaDTO implements EntryPoint {

VerticalPanel verticalPanel = new VerticalPanel();

public void onModuleLoad() {

final Button button = new Button("Click me");
final Label label = new Label();

button.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
if (label.getText().equals(""))
label.setText("Hello World!");
else
label.setText("");
}
});

Button button2 = new Button("Test RPC", new ClickListener() {
public void onClick(Widget sender){
Log.debug("bottone 2 cliccato");
RPCService rpc = new RPCService();
rpc.testRPC("Hello", callback);
}
});

Button button3 = new Button("Test DTO", new ClickListener(){
public void onClick(Widget sender){
Log.debug("bottone 3 cliccato");
RPCService rpc = new RPCService();
rpc.testDTO(callback);
}
});

verticalPanel.add(button);
verticalPanel.add(label);
verticalPanel.add(button2);
verticalPanel.add(button3);
RootPanel.get().add(verticalPanel);
}

AsyncCallback callback = new AsyncCallback()
{
public void onFailure(Throwable caught){
verticalPanel.add(new HTML("Failed: " + caught.getMessage()));
}

public void onSuccess(Object result){
Log.debug("onsuccess partito");
DTO dto = (DTO) result;
String stringa = (String) result;
DatiChiamata datiChiamata = (DatiChiamata)dto.getValue();
verticalPanel.add(new HTML(datiChiamata.nome));
}
};
}
Reply all
Reply to author
Forward
0 new messages