我想我在这里有一个相当简单的问题。但我一直在看这个屏幕太久了。所以我正在尝试(并且失败)在Compojure中使用有状态会话。重新生成代码粘贴 is here 。
您可以看到我尝试使用lib-noir(第62行)来初始化有状态会话。然后当应用程序运行时,我尝试在会话中调用session/put!一些数据(第43行)。
现在,这个堆栈跟踪说在session.put!中,lib-noir正在尝试交换未绑定的会话var。现在,我以为我在第62行做到了。所以我确信这是一个简单的解决方案,另一组眼睛会看到。
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)
谢谢
答案 0 :(得分:2)
James Reeves在https://groups.google.com/forum/#!topic/compojure/yG6nCXiEinU
回答尝试在处理程序/站点和wrap-noir-session *之间进行交换。因为 handler / site应用wrap-session中间件,和 wrap-noir-session *取决于根据文档, 应该在wrap-noir-session之前应用handler / site。
- 詹姆斯
答案 1 :(得分:0)
我认为您需要wrap-noir-session
,而不是wrap-noir-session*
。关于wrap-noir-session*
的文档说(我的重点)“围绕包装会话的有状态层。期待已经使用了包装会话。”
如果您想使用wrap-noir-session*
,我认为您需要明确使用wrap-session
。
答案 2 :(得分:0)
当我不断回答这个问题并忘记它已经解决时,放下我的答案。
(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))