Integrating GWT Remote services is a bit tricky within the LabKey framework. Here's a technique that works.
1. Create a synchronous service interface in your GWT client code:
import com.google.gwt.user.client.rpc.RemoteService; import com.google.gwt.user.client.rpc.SerializableException; public interface MyService extends RemoteService { String getSpecialString(String inputParam) throws SerializableException; }
2. Create the asynchronous counterpart to your synchronous service interface. This is also in client code:
import com.google.gwt.user.client.rpc.AsyncCallback; public interface MyServiceAsync { void getSpecialString(String inputParam, AsyncCallback async); }
3. Implement your service within your server code:
import org.labkey.api.gwt.server.BaseRemoteService; import org.labkey.api.gwt.client.util.ExceptionUtil; import org.labkey.api.view.ViewContext; import com.google.gwt.user.client.rpc.SerializableException; public class MyServiceImpl extends BaseRemoteService implements MyService { public MyServiceImpl(ViewContext context) { super(context); } public String getSpecialString(String inputParameter) throws SerializableException { if (inputParameter == null) throw ExceptionUtil.convertToSerializable(new IllegalArgumentException("inputParameter may not be null")); return "Your special string was: " + inputParameter; } }
4. Within the server Spring controller that contains the GWT action, provide a service entry point:
import org.labkey.api.gwt.server.BaseRemoteService; import org.labkey.api.action.GWTServiceAction; @RequiresPermission(ACL.PERM_READ) public class MyServiceAction extends GWTServiceAction { protected BaseRemoteService createService() { return new MyServiceImpl(getViewContext()); } }
5. Within your GWT client code, retrive the service with a method like this. Note that caching the service instance is important, since construction and configuration is expensive.
import com.google.gwt.core.client.GWT; import org.labkey.api.gwt.client.util.ServiceUtil; private MyServiceAsync _myService; private MyServiceAsync getService() { if (_testService == null) { _testService = (MyServiceAsync) GWT.create(MyService.class); ServiceUtil.configureEndpoint(_testService, "myService"); } return _testService; }
6. Finally, call your service from within your client code:
public void myClientMethod() { getService().getSpecialString("this is my input string", new AsyncCallback() { public void onFailure(Throwable throwable) { // handle failure here } public void onSuccess(Object object) { String returnValue = (String) object; // returnValue now contains the string returned from the server. } }); }
previousnext |
expand all collapse all |