2012-09-04 54 views
2

我正在尝试在Google App Engine(Java)上创建一个使用Json的REST风格的Web服务客户端。我试过了Sitebricks和Jersey,但他们都没有工作。有没有可用于在GAE上创建RESTful Web服务客户端的框架?如何在Google App Engine上创建RESTful客户端?

异常的Sitebricks:

Caused by: java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "modifyThreadGroup") 
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:366) 
    at java.security.AccessController.checkPermission(AccessController.java:555) 
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) 
    at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkPermission(DevAppServerFactory.java:283) 
    at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkAccess(DevAppServerFactory.java:308) 
    at java.lang.ThreadGroup.checkAccess(ThreadGroup.java:315) 
    at java.lang.Thread.init(Thread.java:376) 
    at java.lang.Thread.<init>(Thread.java:525) 
    at com.ning.http.client.AsyncHttpClientConfig$Builder$2.newThread(AsyncHttpClientConfig.java:421) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.<init>(ThreadPoolExecutor.java:598) 
    at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:913) 
    at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1336) 
    at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:132) 
    at com.ning.http.client.providers.jdk.JDKAsyncHttpProvider.execute(JDKAsyncHttpProvider.java:156) 
    at com.ning.http.client.providers.jdk.JDKAsyncHttpProvider.execute(JDKAsyncHttpProvider.java:123) 
    at com.ning.http.client.AsyncHttpClient.executeRequest(AsyncHttpClient.java:496) 
    at com.google.sitebricks.client.AHCWebClient.simpleRequest(AHCWebClient.java:85) 
    at com.google.sitebricks.client.AHCWebClient.get(AHCWebClient.java:133) 

而对于网队:

Caused by: java.security.AccessControlException: access denied ("javax.xml.bind.JAXBPermission" "setDatatypeConverter") 
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:366) 
    at java.security.AccessController.checkPermission(AccessController.java:555) 
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) 
    at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkPermission(DevAppServerFactory.java:283) 
    at javax.xml.bind.DatatypeConverter.setDatatypeConverter(DatatypeConverter.java:134) 
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl$3.run(JAXBContextImpl.java:304) 
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl$3.run(JAXBContextImpl.java:303) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:302) 
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1170) 
    at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:145) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:248) 
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:235) 
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:432) 
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:637) 
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:584) 
    at com.sun.jersey.core.provider.jaxb.AbstractJAXBProvider.getStoredJAXBContext(AbstractJAXBProvider.java:194) 
    at com.sun.jersey.core.provider.jaxb.AbstractJAXBProvider.getJAXBContext(AbstractJAXBProvider.java:187) 
    at com.sun.jersey.core.provider.jaxb.AbstractJAXBProvider.getUnmarshaller(AbstractJAXBProvider.java:139) 
    at com.sun.jersey.core.provider.jaxb.AbstractJAXBProvider.getUnmarshaller(AbstractJAXBProvider.java:122) 
    at com.sun.jersey.core.provider.jaxb.AbstractRootElementProvider.readFrom(AbstractRootElementProvider.java:111) 
    at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:565) 
    at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:517) 
    at com.sun.jersey.api.client.WebResource.handle(WebResource.java:684) 
    at com.sun.jersey.api.client.WebResource.get(WebResource.java:191) 
+0

看起来您可能在发出您的“GET”请求之前缺少凭证认证步骤。您可能需要先登录服务来建立会话。在发布GET之前,在客户端上设置您的身份验证模型和凭证。 –

+0

我遵循http://tugdualgrall.blogspot.com/2010/02/create-and-deploy-jax-rs-rest-service.html,它为我工作没有任何问题。 –

+0

@LarryHector不,不是,它在没有认证的简单Jetty上完美运行。 AccessControlException是由于AppEngine中的沙箱限制。 –

回答

1

如何google-api-java-client

在某些层面上,您只需要能够发出HTTP请求并将响应解析为JSON。除了那些让Jersey/Sitebricks更吸引你的功能之外,你还有哪些功能?

+0

感谢您的提示。我不知道google-http-java-client。我会看看。我需要SSL支持,并且我已经使用Sitebricks来提供HTML页面和RESTful Web服务。 –

-1

尝试jello-framework。它允许您通过RESTful(OData)服务公开您的数据模型,并提供开箱即用的UI视图,因此您可以测试应用程序并立即开始与数据交互。

披露 - 我是Jello框架的创建者。不过,我决定将它作为GAE上RESTful客户端的有效答案添加,因为它可以为所问问题提供很好的解决方案。

+0

嗨约兰,看看[这里](http://stackoverflow.com/help/promotion)。 – bummi

+0

Hi @bummi,你是对的,我应该加一个披露(我刚刚做过)。然而,只要它回答了问题,我与jello框架有关的事实不应该影响答案的有效性。 – Yoram

相关问题