clojure/ring/jetty : I am using > lein ring server. 如何配置实例化的 jetty 实例?

标签 clojure jetty leiningen ring

当我直接调用 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}

这很好用,但现在我又遇到了 FULL HEAD 问题。所以我尝试在那里添加一个配置器:
: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)

我认为这与将函数直接放在 map 中有关,所以我在项目之外(在 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 错误。有任何想法吗?谢谢!

最佳答案

里面写的东西 defproject默认情况下不评估表单,但您可以使用 ~ (取消引用)在 defproject当您需要时:

(defproject foo "1.2.3"
  ...
  :some-fn-key ~(fn [& args] ...))

在这种特殊情况下,您需要取消引用 fn定义你的配置器函数的表单(它没有取消引号被用作包含一堆符号的列表,而不是编译成一个函数)。

或者,您可以在 defproject 之外定义配置器表单并在 defproject 中引用其名称与您的第二种方法一样,但是您需要取消引用 defproject 中的名称-- 否则它将被视为一个符号。注意。在后一种情况下不会产生异常,因为符号实际上是可调用的并接受任意参数(但只有在使用映射或集合以外的其他东西调用时才返回 nil;对于映射或集合,它们在它们的论据)。

关于clojure/ring/jetty : I am using > lein ring server. 如何配置实例化的 jetty 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10289617/

相关文章:

validation - 在 Liberator 中使用 Prismatic/schema 进行表单验证

emacs - Vagrant /Clojure/Emacs

具有特定开始和无限结束的 Clojure 范围

jetty - 如果不使用 JSP,Jetty 是否需要 JDK

clojure - 试图理解隐式 Leiningen 源路径/命名空间设置假设

list - 在 Clojure 中过滤列表

java - Eclipse 中的 Jetty - 从 .war 加载静态内容

linux - scala/电梯 jetty IntelliJ Idea : imported javascript files not showing changes in served page

clojure - ClassNotFoundException 试图为任何项目运行 "lein run server-headless"

eclipse - 未找到类 : :as-file of protocol: #'clojure. lang.PersistentVector 的方法 : clojure. java.io/Coercions 的实现