【问题标题】:Restlet Android with AppEngine Communication Error带有 AppEngine 通信错误的 Restlet Android
【发布时间】:2012-01-23 14:03:57
【问题描述】:

我有同样的问题:http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2838513

我尝试使用 GAE 和 android 之间的通信制作一个非常简单的应用程序,我也面临同样的问题。

我有 2.1 Snapshot (2012-01-15) android 版本 我有 2.1 Snapshot (2012-01-15) gae 版本

在android的classPath中我有:

  • org.restlet.ext.jackson
  • org.restlet
  • 杰克逊-all.1.9.3

我的 GAE 应用程序有一个共享源文件夹,用于共享资源和 bean

在 GAE 的 classPath 中,我有: * org.restlet.ext.jackson * org.restlet.ext.json * org.restlet.ext.servlet * org.restlet * 杰克逊-all.1.9.3

这是我的 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>

这里是共享代码:

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; } }

这是我的服务的实现:

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; } }

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; } }

如果我尝试使用 url:http://localhost:8888/rest/ 它可以工作,我有 {"objectB":{"name":"ObjectB"},"listObjectB":[{"name":"ObjectB"}],"name":"ObjectA"} 作为返回,这是完全正常的。

这是我的安卓代码:

// 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; }

使用android项目我总是有以下错误:

01-23 14:09:12.594: E/TestAndroidActivity(1620): 调用休息服务器时出错 01-23 14:09:12.594: E/TestAndroidActivity(1620): 通信错误 (1001) - 连接器未能完成与服务器的通信 01-23 14:09:12.594: E/TestAndroidActivity(1620): 在 org.restlet.resource.ClientResource.doError(ClientResource.java:579) 01-23 14:09:12.594: E/TestAndroidActivity(1620): 在 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): 在 com.binomed.android.rpc.rest.RestletAccesClass.callService(RestletAccesClass.java:14) 01-23 14:09:12.594: E/TestAndroidActivity(1620): 在 com.binomed.android.rpc.TestRpcAndroidActivity$3.doInBackground(TestRpcAndroidActivity.java:153) 01-23 14:09:12.594: E/TestAndroidActivity(1620): 在 com.binomed.android.rpc.TestRpcAndroidActivity$3.doInBackground(TestRpcAndroidActivity.java:1) 01-23 14:09:12.594: E/TestAndroidActivity(1620): 在 android.os.AsyncTask$2.call(AsyncTask.java:185) 01-23 14:09:12.594: E/TestAndroidActivity(1620): 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 01-23 14:09:12.594: E/TestAndroidActivity(1620): 在 java.util.concurrent.FutureTask.run(FutureTask.java:137) 01-23 14:09:12.594: E/TestAndroidActivity(1620): 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) 01-23 14:09:12.594: E/TestAndroidActivity(1620): 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) 01-23 14:09:12.594: E/TestAndroidActivity(1620): 在 java.lang.Thread.run(Thread.java:1096)

你知道如何解决这个问题吗?

问候

【问题讨论】:

    标签: android google-app-engine restlet


    【解决方案1】:

    您能否尝试添加基于 Apache HTTP 客户端的客户端连接器,而不是内部连接器(还没有完全稳定)?请参阅此处的说明: http://wiki.restlet.org/docs_2.1/13-restlet/275-restlet/266-restlet.html

    请注意,我们打算为 2.1.0 修复此连接器的稳定性问题。

    【讨论】:

    • 尽快,最好是在您开始在应用中使用 Restlet 之前
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    相关资源
    最近更新 更多