smartrevolution / clj-gae-datastore

A Clojure mini-language for the Google App Engine Datastore
GNU Lesser General Public License v3.0
73 stars 9 forks source link

Hello I got following error. plz help me. #6

Open ezcocoa opened 10 years ago

ezcocoa commented 10 years ago

Hello.

I evaluated the following code. (datastore/store-entities! books)

and i got the follwing error. I don't know what should i do.

java.lang.NullPointerException: No API environment is registered for this thread. DatastoreApiHelper.java:86 com.google.appengine.api.datastore.DatastoreApiHelper.getCurrentAppId DatastoreApiHelper.java:96 com.google.appengine.api.datastore.DatastoreApiHelper.getCurrentAppIdNamespace Key.java:106 com.google.appengine.api.datastore.Key. Key.java:90 com.google.appengine.api.datastore.Key. Key.java:86 com.google.appengine.api.datastore.Key. Entity.java:125 com.google.appengine.api.datastore.Entity. Entity.java:106 com.google.appengine.api.datastore.Entity. datastore_access_dsl.clj:158 com.freiheit.gae.datastore.datastore-access-dsl/create-empty-entity datastore_access_dsl.clj:309 com.freiheit.gae.datastore.datastore-access-dsl/create-entity datastore_access_dsl.clj:307 com.freiheit.gae.datastore.datastore-access-dsl/create-entity /Users/hojunbaek/src/clojure/clj-gae-datastore/src/example/com/freiheit/gae/datastore/example.clj:13 com.freiheit.gae.datastore.example/eval4979[fn] MultiFn.java:227 clojure.lang.MultiFn.invoke core.clj:2487 clojure.core/map[fn] LazySeq.java:42 clojure.lang.LazySeq.sval

amouat commented 10 years ago

You need to start the local version of GAE. I think there is an example in the code somewhere, but something like:

(defn init-app-engine
  "Initialize the app engine services. Call it once from the REPL"
  ([]
     (init-app-engine "/tmp"))
  ([dir]
     (let [default-port 9090
       env-proxy (proxy [ApiProxy$Environment] []
               (isLoggedIn [] false)
               (getRequestNamespace [] "")
               (getDefaultNamespace [] "")
               (getAttributes [] (let [attributes (HashMap.)
                           local-server-url (str "http://localhost:" default-port)]
                       (.put attributes "com.google.appengine.server_url_key" local-server-url)
                       attributes))
               (getAppId [] "local"))
       local-env (proxy [LocalServerEnvironment] []
               (getAppDir [] (File. dir))
               (getAddress [] "localhost")
               (getPort [] default-port)
               (waitForServerToStart [] nil)
           (enforceApiDeadlines [] true)
           (simulateProductionLatencies [] true))
       api-proxy (.create (ApiProxyLocalFactory.) local-env)]
       (do
     (com.google.apphosting.api.ApiProxy/setEnvironmentForCurrentThread env-proxy)
     (com.google.apphosting.api.ApiProxy/setDelegate api-proxy)))))

If you call that function before evaluating the above, everything should be hunky dory.

amouat commented 10 years ago

You should look at https://github.com/smartrevolution/clj-gae-datastore/blob/master/src/example/com/freiheit/gae/datastore/example.clj