Reputation: 117
I have the same problem as : http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2838513
I've try to make a very simple application with communication between a GAE and android And I'm facing the same problem.
I have the 2.1 Snapshot (2012-01-15) android version I have the 2.1 Snapshot (2012-01-15) gae version
In the classPath of android I have :
I have a shared source folder with my GAE application for sharing resources and beans
In the classPath of GAE I have : * org.restlet.ext.jackson * org.restlet.ext.json * org.restlet.ext.servlet * org.restlet * jackson-all.1.9.3
Here is my web.xml :
<servlet-name>RestletServlet</servlet-name>
<servlet-class>org.restlet.ext.servlet.ServerServlet</servlet-class>
<init-param>
<param-name>org.restlet.application</param-name>
<param-value>com.binomed.server.rest.RestletApplication</param-value>
</init-param>
</servlet>
<!-- Catch all requests -->
<servlet-mapping>
<servlet-name>RestletServlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
Here is the shared code :
package com.binomed.client.rest;
import org.restlet.resource.Get;
import com.binomed.client.rest.dto.RestletObjectA;
public interface IRestletService {
@Get
RestletObjectA getMessage() throws Exception;
}
package com.binomed.client.rest.dto;
import java.io.Serializable;
import java.util.List;
public class RestletObjectA implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
public RestletObjectA() {
super();
}
private RestletObjectB objectB;
private List listObjectB;
private String name;
public RestletObjectB getObjectB() {
return objectB;
}
public void setObjectB(RestletObjectB objectB) {
this.objectB = objectB;
}
public List getListObjectB() {
return listObjectB;
}
public void setListObjectB(List listObjectB) {
this.listObjectB = listObjectB;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.binomed.client.rest.dto;
import java.io.Serializable;
public class RestletObjectB implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
public RestletObjectB() {
super();
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
And here is the implementation of my service :
package com.binomed.server.rest;
import java.util.ArrayList;
import org.restlet.resource.Get;
import org.restlet.resource.ServerResource;
import com.binomed.client.rest.IRestletService;
import com.binomed.client.rest.dto.RestletObjectA;
import com.binomed.client.rest.dto.RestletObjectB;
public class RestResource extends ServerResource implements IRestletService {
@Override
@Get
public RestletObjectA getMessage() throws Exception {
RestletObjectB objB = new RestletObjectB();
objB.setName("ObjectB");
RestletObjectA result = new RestletObjectA();
result.setName("ObjectA");
result.setListObjectB(new ArrayList());
result.getListObjectB().add(objB);
result.setObjectB(objB);
return result;
}
}
and
package com.binomed.server.rest;
import org.restlet.Application;
import org.restlet.Restlet;
import org.restlet.routing.Router;
public class RestletApplication extends Application {
/**
* Creates a root Restlet that will receive all incoming calls.
*/
@Override
public Restlet createInboundRoot() {
// Create a router Restlet that routes each call to a
// new instance of HelloWorldResource.
Router router = new Router(getContext());
// Defines only one route
// router.attachDefault(new Directory(getContext(), "war:///"));
// router.attach("/test/", RestResource.class);
router.attachDefault(RestResource.class);
return router;
}
}
If I try the url : http://localhost:8888/rest/ it works, I have {"objectB":{"name":"ObjectB"},"listObjectB":[{"name":"ObjectB"}],"name":"ObjectA"} as return which is totaly normal.
Here is my android code :
// Use an AsyncTask to avoid blocking the UI thread
new AsyncTask() {
@Override
protected RestletObjectA doInBackground(Void... arg0) {
try {
return RestletAccesClass.callService();
} catch (Exception e) {
Log.e(TAG, "Error during calling rest server", e);
return null;
}
}
@Override
protected void onPostExecute(RestletObjectA result) {
if (result != null) {
restlet.setText(result.getName() + ", B : " + result.getObjectB().getName());
} else {
restlet.setText("Failure during getting result");
}
btnRestlet.setEnabled(true);
}
}.execute();
and :
public static RestletObjectA callService() throws Exception {
ClientResource clientResource = new ClientResource(TestRpcAndroidActivity.LOCALHOST + "/rest/");
IRestletService service = clientResource.wrap(IRestletService.class);
RestletObjectA result = service.getMessage();
return result;
}
With the android project I always have the following error :
01-23 14:09:12.594: E/TestAndroidActivity(1620): Error during calling rest server 01-23 14:09:12.594: E/TestAndroidActivity(1620): Communication Error (1001) - The connector failed to complete the communication with the server 01-23 14:09:12.594: E/TestAndroidActivity(1620): at org.restlet.resource.ClientResource.doError(ClientResource.java:579) 01-23 14:09:12.594: E/TestAndroidActivity(1620): at org.restlet.engine.resource.ClientInvocationHandler.invoke(ClientInvocationHandler.java:233) 01-23 14:09:12.594: E/TestAndroidActivity(1620): at $Proxy5.getMessage(Native Method) 01-23 14:09:12.594: E/TestAndroidActivity(1620): at com.binomed.android.rpc.rest.RestletAccesClass.callService(RestletAccesClass.java:14) 01-23 14:09:12.594: E/TestAndroidActivity(1620): at com.binomed.android.rpc.TestRpcAndroidActivity$3.doInBackground(TestRpcAndroidActivity.java:153) 01-23 14:09:12.594: E/TestAndroidActivity(1620): at com.binomed.android.rpc.TestRpcAndroidActivity$3.doInBackground(TestRpcAndroidActivity.java:1) 01-23 14:09:12.594: E/TestAndroidActivity(1620): at android.os.AsyncTask$2.call(AsyncTask.java:185) 01-23 14:09:12.594: E/TestAndroidActivity(1620): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 01-23 14:09:12.594: E/TestAndroidActivity(1620): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 01-23 14:09:12.594: E/TestAndroidActivity(1620): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) 01-23 14:09:12.594: E/TestAndroidActivity(1620): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) 01-23 14:09:12.594: E/TestAndroidActivity(1620): at java.lang.Thread.run(Thread.java:1096)
Did you have any idea about how to solve this problem ?
regards
Upvotes: 1
Views: 1907
Reputation: 2892
Could you try adding the client connector based on Apache HTTP Client instead of the internal one (which isn't fully stable yet)? See instructions here: http://wiki.restlet.org/docs_2.1/13-restlet/275-restlet/266-restlet.html
Note that we intend to fix the stability issues on this connector for 2.1.0.
Upvotes: 1