Java 如何在Google App Engine上创建RESTful客户端?

Java 如何在Google App Engine上创建RESTful客户端?,java,json,google-app-engine,rest,client,Java,Json,Google App Engine,Rest,Client,我正在尝试在Google App Engine(Java)上创建一个使用Json的RESTful web服务客户端。我试过Sitebricks和Jersey,但它们似乎都不管用。是否有任何框架可用于在GAE上创建RESTful web服务客户端 Sitebricks的例外情况: Caused by: java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "modifyThreadGro

我正在尝试在Google App Engine(Java)上创建一个使用Json的RESTful web服务客户端。我试过Sitebricks和Jersey,但它们似乎都不管用。是否有任何框架可用于在GAE上创建RESTful web服务客户端

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)
原因:java.security.AccessControlException:拒绝访问(“java.lang.RuntimePermission”“modifyThreadGroup”)
位于java.security.AccessControlContext.checkPermission(AccessControlContext.java:366)
在java.security.AccessController.checkPermission(AccessController.java:555)
位于java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
在com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkPermission(DevAppServerFactory.java:283)
在com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkAccess(DevAppServerFactory.java:308)
位于java.lang.ThreadGroup.checkAccess(ThreadGroup.java:315)
位于java.lang.Thread.init(Thread.java:376)
位于java.lang.Thread.(Thread.java:525)
在com.ning.http.client.AsyncHttpClientConfig$Builder$2.newThread上(AsyncHttpClientConfig.java:421)
位于java.util.concurrent.ThreadPoolExecutor$Worker。(ThreadPoolExecutor.java:598)
位于java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:913)
位于java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1336)
位于java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:132)
位于com.ning.http.client.providers.jdk.JDKAsyncHttpProvider.execute(JDKAsyncHttpProvider.java:156)
位于com.ning.http.client.providers.jdk.JDKAsyncHttpProvider.execute(JDKAsyncHttpProvider.java:123)
位于com.ning.http.client.AsyncHttpClient.executeRequest(AsyncHttpClient.java:496)
位于com.google.sitebricks.client.AHCWebClient.simpleRequest(AHCWebClient.java:85)
位于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)
原因:java.security.AccessControlException:拒绝访问(“javax.xml.bind.jaxpermission”“setDatatypeConverter”)
位于java.security.AccessControlContext.checkPermission(AccessControlContext.java:366)
在java.security.AccessController.checkPermission(AccessController.java:555)
位于java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
在com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkPermission(DevAppServerFactory.java:283)
位于javax.xml.bind.DatatypeConverter.setDatatypeConverter(DatatypeConverter.java:134)
位于com.sun.xml.bind.v2.runtime.JAXBContextImpl$3.run(JAXBContextImpl.java:304)
位于com.sun.xml.bind.v2.runtime.JAXBContextImpl$3.run(JAXBContextImpl.java:303)
位于java.security.AccessController.doPrivileged(本机方法)
位于com.sun.xml.bind.v2.runtime.JAXBContextImpl.(JAXBContextImpl.java:302)
位于com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1170)
位于com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:145)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:601)
位于javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:248)
位于javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:235)
位于javax.xml.bind.ContextFinder.find(ContextFinder.java:432)
位于javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:637)
位于javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:584)
位于com.sun.jersey.core.provider.jaxb.AbstractJAXBProvider.getStoredJAXBContext(AbstractJAXBProvider.java:194)
位于com.sun.jersey.core.provider.jaxb.AbstractJAXBProvider.getJAXBContext(AbstractJAXBProvider.java:187)
位于com.sun.jersey.core.provider.jaxb.AbstractJAXBProvider.getUnmarshaller(AbstractJAXBProvider.java:139)
位于com.sun.jersey.core.provider.jaxb.AbstractJAXBProvider.getUnmarshaller(AbstractJAXBProvider.java:122)
位于com.sun.jersey.core.provider.jaxb.AbstractRootElementProvider.readFrom(AbstractRootElementProvider.java:111)
位于com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:565)
位于com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:517)
位于com.sun.jersey.api.client.WebResource.handle(WebResource.java:684)
位于com.sun.jersey.api.client.WebResource.get(WebResource.java:191)
怎么样

在某种程度上,您只需要能够发出HTTP请求并将响应解析为JSON。除此之外,您还希望看到哪些功能使Jersey/Sitebricks对您更具吸引力?

怎么样

在某种程度上,您只需要能够发出HTTP请求并将响应解析为JSON。除了让Jersey/Sitebricks对您更具吸引力之外,您还想要什么功能?

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

披露-我是果冻框架的创造者。尽管如此,我还是决定添加它作为GAE上RESTful客户端的有效答案,因为它可以为所问问题提供一个很好的解决方案

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


披露-我是果冻框架的创造者。尽管如此,我还是决定添加它作为GAE上RESTful客户端的有效答案,因为它可以为所问问题提供一个很好的解决方案

在发出“获取”请求之前,您可能缺少凭据身份验证步骤。Y