2017-03-07 24 views
1

我在启动我的应用程序时遇到了一些麻烦。Clojure - StuartSierraComponent开始

这里是我的core.clj

(ns myapp.core 
    (:require [yada.yada :as yada :refer [resource as-resource]] 
      [yada.resources.file-resource :refer [new-directory-resource]] 
      [aero.core :refer [read-config]] 
      [web.view :as view] 
      [web.routes :as routes] 
      [clojure.java.io :as io] 
      [aero.core :refer [read-config]] 
      [com.stuartsierra.component :as component] 
      [clojure.java.jdbc :as jdbc] 
      [clojure.tools.namespace.repl :refer (refresh)] 
      [ring.adapter.jetty :as jetty] 
      [environ.core :refer [env]])) 

(defrecord Listener [listener] 
    component/Lifecycle 
    (start [component] 
    (assoc component :listener (yada/listener 
           ["/" 
            [(view/view-route) 
            routes/route-handler 
            ["public/" (new-directory-resource (io/file "target/cljsbuild/public") {})] 
            [true (as-resource nil)]]]   ))) 
    (stop [component] 
    (when-let [close (-> component :listener :close)] 
     (close)) 
    (assoc component :listener nil))) 

(defn new-system [] 
    (component/system-map 
    :listener (map->Listener {}) 
    )) 

(def system nil) 

(defn init [] 
    (alter-var-root #'system 
        (constantly (new-system)))) 

(defn start [] 
    (alter-var-root #'system component/start)) 

(defn stop [] 
    (alter-var-root #'system 
        (fn [s] (when s (component/stop s))))) 

(defn go [] 
    (init) 
    (start)) 

(defn reset [] 
    (stop) 
    (refresh :after 'web.core/go)) 

(defn -main 
    [& [port]] 
    (let [port (Integer. (or port (env :port) 3300))] 
    (jetty/run-jetty (component/start (new-system)) {:port port :join? false}))) 

我测试了斯图尔特Sierra的库组件。

我可以启动应用程序,如果我做lein repl(go)但我想开始运行lein run我的应用程序(见程序是什么样的,如果我在生产中部署它)。当我在浏览器中做lein run我得到的错误

HTTP ERROR: 500 

Problem accessing /view. Reason: 

    com.stuartsierra.component.SystemMap cannot be cast to clojure.lang.IFn 

我很困惑,因为我不知道为什么系统地图(new-system)是错误。我也不确定错误是什么意思,所以我不知道如何修复它

有人请帮忙。谢谢

+0

你可以通过启动一个新的repl,(或从emacs插入),改变到myapp.core命名空间,并评估'( - 主“8080”)来重现这个问题' –

回答

1

你的-main函数调用jetty/run-jetty函数的第一个参数必须是一个环处理函数 - 接受请求映射并产生响应映射的函数。您正在传递一个系统,导致异常。异常意味着Jetty适配器尝试将通过的系统作为函数调用,但不能,因为系统实际上是一条记录,并且不实现函数接口IFn

我不熟悉yada,但它看起来像yada/listener启动(Aleph)服务器,所以没有必要显式调用码头适配器。你main应该是这个样子:

(defn -main [& [port]] (component/start (new-system)))

端口(或任何其他配置)为需要它的一个参数new-system,然后转发到组件可以通过(在你的情况下,港口应传递到执行Listener,然后调用yada/listener调用start)。