当我直接调用jetty处理程序时,我能够传递一个这样的配置器:
(def header-buffer-size 8388608)
(defn start [port]
(ring/run-jetty
(var app)
{:port port
:join? false
:host "127.0.0.1"
:configurator
(fn [jetty]
(doseq [connector (.getConnectors jetty)]
(.setHeaderBufferSize connector header-buffer-size)))}))
我不得不这样做,因为我在发帖时一直收到一个FULL HEAD错误。现在我重构了要使用的东西> lein ring server直接从命令行调用。
> lein ring server
这使用了我的project.clj中指定的一些配置:
:ring {:handler caribou.api.core/app
:servlet-name "caribou-api"
:init caribou.api.core/init
:port 33443}
这很好用,但现在我再次得到了全头问题。所以我试着在那里添加一个配置器:
:ring {:handler caribou.api.core/app
:servlet-name "caribou-api"
:init caribou.api.core/init
:configurator
(fn [jetty]
(doseq [connector (.getConnectors jetty)]
(.setHeaderBufferSize connector 8388608)))
:port 33443})
这个堆栈跟踪失败了:
Exception in thread "main" java.lang.ClassCastException:
clojure.lang.PersistentList cannot be cast to clojure.lang.IFn
at ring.adapter.jetty$run_jetty.invoke(jetty.clj:66)
at ring.server.standalone$serve$fn__833.invoke(standalone.clj:78)
at ring.server.standalone$try_port.invoke(standalone.clj:12)
at ring.server.standalone$serve.doInvoke(standalone.clj:75)
at clojure.lang.RestFn.invoke(RestFn.java:423)
at ring.server.leiningen$serve.invoke(leiningen.clj:20)
我认为这与将函数直接放在地图中的方式有关,所以我在项目之外(在caribou.api.core中)定义了它并尝试引用它,就像我做其他地方定义的其他函数一样:
;; in caribou/api/core.clj
(def header-buffer-size 8388608)
(defn full-head-avoidance
[jetty]
(doseq [connector (.getConnectors jetty)]
(.setHeaderBufferSize connector header-buffer-size)))
;; in project.clj
:ring {:handler caribou.api.core/app
:servlet-name "caribou-api"
:init caribou.api.core/init
:configurator caribou.api.core/full-head-avoidance
:port 33443})
这会旋转应用程序,但发布时仍然会收到413:FULL HEAD错误。有任何想法吗?谢谢!
答案 0 :(得分:4)
默认情况下不会评估写在defproject
表单中的内容,但是当您需要时,可以在~
中使用defproject
(取消引用):
(defproject foo "1.2.3"
...
:some-fn-key ~(fn [& args] ...))
在这种特殊情况下,你取消引用定义配置函数的fn
形式(没有取消引用它被用作包含一堆符号的列表,而不是编译成函数)。 / p>
或者,您可以在defproject
表单之外定义配置程序,并在第二种方法中引用defproject
内的名称,但是您需要在defproject
内取消引用该名称 - - 否则它将被视为符号。 NB。在后一种情况下,不会产生任何异常,因为符号实际上是可调用的并且接受任意参数(但是当使用除地图或集合之外的其他东西调用时,只返回nil
;对于地图或集合,它们看起来自己在他们的论点中。)
答案 1 :(得分:3)
答案是不使用响铃服务器,只使用ring / ring-jetty-adapter直接启动jetty。这样我仍然可以传递配置器,BTW已经改为:
(defn full-head-avoidance
[jetty]
(doseq [connector (.getConnectors jetty)]
(.setRequestHeaderSize connector header-buffer-size)))