2012-09-04 55 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

相關問題