2013-02-11 10 views
6

Penso di avere un problema abbastanza semplice qui. Ma ho guardato questo schermo troppo a lungo. Quindi sto provando (e fallendo) a ottenere sessioni di stato lavorando in Compojure. Il codice del rifacesso incolla il numero is here.Come usare lib-noir stateful-sessions in Compojure

Puoi vedermi provare a utilizzare lib-noir (riga 62) per inizializzare le sessioni con stato. Quindi, quando l'app è in esecuzione, cerco di effettuare una chiamata a session/put! alcuni dati nella sessione (riga 43).

Ora, questo stacktrace dice che in session.put !, lib-noir sta provando a scambiare una sessione var che non è stata vincolata. Ora, pensavo di averlo fatto sulla linea 62. Quindi sono sicuro che questa è una semplice soluzione che un altro insieme di occhi vedrà.

java.lang.ClassCastException: clojure.lang.Var$Unbound cannot be cast to clojure.lang.Atom                                                                                 
     at clojure.core$swap_BANG_.invoke(core.clj:2110)                                                                                         
     at noir.session$put_BANG_.invoke(session.clj:18)                                                                                         
     at bkell.http.handler$fn__6159.invoke(handler.clj:156)                                                                                        
     at compojure.core$make_route$fn__3800.invoke(core.clj:93)                                                                                       
     at compojure.core$if_route$fn__3784.invoke(core.clj:39)                                                                                       
     at compojure.core$if_method$fn__3777.invoke(core.clj:24)                                                                                       
     at compojure.core$routing$fn__3806.invoke(core.clj:106)                                                                                       
     at clojure.core$some.invoke(core.clj:2390)                                                                                           
     at compojure.core$routing.doInvoke(core.clj:106)                                                                                         
     at clojure.lang.RestFn.applyTo(RestFn.java:139)                                                                                         
     ... 
     at java.lang.Thread.run(Thread.java:619) 

Thanks

+0

Hai mai trovato una soluzione a questo problema? Ho avuto lo stesso problema e ho iniziato una discussione, ma non ho ricevuto alcuna risposta. – dizzystar

risposta

0

I think you want wrap-noir-session, non wrap-noir-session*. La documentazione sulla wrap-noir-session* dice (il corsivo è mio) "Uno strato stateful intorno wrap-sessione. si attende che wrap-sessione è già stato utilizzato."

Se si desidera utilizzare wrap-noir-session* Penso che avrete bisogno di utilizzare wrap-session in modo esplicito.

+0

Grazie per la risposta. Sì, ho sicuramente provato sia con che senza l'asterisco. Ho anche provato a rimuovere la chiamata ad un amico/autenticarsi. Quindi l'app def appare come: '(def app (gestore/sito (sessione/wrap-noir-session * app-routes))." Ma ho ancora lo stesso errore Var $ Unbound **. l'atomo di sessione non viene vincolato quando chiamo wrap-noir-session, quindi cerco il giusto incantesimo. – Nutritioustim

2

Risposto da James Reeves a - https://groups.google.com/forum/#!topic/compojure/yG6nCXiEinU

Provate a scambiare intorno gestore/sito e wrap-noir-sessione *. Poiché il gestore/sito applica il middleware wrap-session e la sessione wrap-noir * dipende da quella secondo la documentazione, il gestore/sito deve essere applicato prima della sessione wrap-noir.

  • James
0

Mettere giù la mia risposta come io continuo a venire a questa domanda e dimenticando che è stato risolto.

(ns my-project.handler 
    (:require (compojure [handler :as handler] 
         [route :as route] 
         [core :refer :all]) 
       [noir.util.middleware :as middleware] 
       [noir.session :as session])) 

(defroutes my-routes 
    (GET "/put" req (session/put! :test "yes")) 
    (GET "/get" req (session/get :test)) 
    (route/resources "/") 
    (route/not-found "Not Found")) 

(def app 
    (-> 
    (handler/site my-routes) 
    session/wrap-noir-flash ; only if you need flash-put! and flash-get 
    session/wrap-noir-session)) 
Problemi correlati