尝试在Compojure中使用ring.middleware.json-params

3

我对Clojure、leiningen和Java工具链都不熟悉(但对Lisp、函数式编程和软件有一定了解)。我正在尝试在Compojure中引导一些RESTful Web服务。

按照指南,我很容易开始使用compojure。

https://github.com/weavejester/compojure/wiki/Getting-Started

我现在正在尝试逐步添加来自已过时的网站的功能。
http://mmcgrana.github.com/2010/08/clojure-rest-api.html

从上面第一个链接提供的使用leiningen构建的工作项目开始(可以通过lein ring start启动),我只需在project.clj文件中添加一行代码。

(defproject hello-world "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :dependencies [[org.clojure/clojure "1.4.0"]
                 [ring-json-params "0.1.3"]  ;;; <---===/// Here's the line I added
                 [compojure "1.1.5"]]
  :plugins [[lein-ring "0.8.2"]]
  :ring {:handler hello-world.handler/app}
  :profiles
  {:dev {:dependencies [[ring-mock "0.1.3"]]}})

我再次运行lein deps,然后大量的文件被下载。一切正常,项目仍然能够运行。现在我要在handler.clj中添加一行代码:

(ns hello-world.handler
  (:use     compojure.core)
  (:use     ring.middleware.json-params)  ;;; <---===/// Here's the line I added
  (:require [compojure.handler :as handler]
            [compojure.route :as route]))

(defroutes app-routes
  (GET "/" [] "Hello World")
  (route/not-found "Not Found"))

(def app
  (handler/site app-routes))

现在我明白了

java.io.FileNotFoundException: Could not locate ring/middleware/json_params__init.class or ring/middleware/json_params.clj on classpath: 
 at clojure.lang.RT.load (RT.java:432)
    clojure.lang.RT.load (RT.java:400)
    clojure.core$load$fn__4890.invoke (core.clj:5415)
    clojure.core$load.doInvoke (core.clj:5414)

因为我是完全不懂工具链的新手,所以我不知道如何设置或检查类路径,也不知道json_params由leiningen放置在哪里,甚至不知道如何查看类文件以找到应该使用的名称。

除了针对这个问题的具体解决方案外,我也希望得到一些新手入门的指导,以便将来可以自己解决类似的简单问题。

1个回答

1
当你启动服务器时,你是否遇到了这个错误?在我的环境中没有任何问题。 enter image description here 以下是我所做的事情:
lein new compojure hello

然后像往常一样更改project.clj文件,然后运行:
lein deps

At last add:

(:use ring.middleware.json-params)

处理 handle.clj 文件。

启动服务器,没有错误发生。

我建议您建立一个新项目并重试。


当我在emacs nrepl中编译项目时出现了错误....看起来问题在那里,在工具链的emacs部分--这是我没有报告的一个部分。lein ring server正在工作。 - Reb.Cabin
是的,重新启动emacs并重新执行nrepl-jack-in解决了问题。看起来更改project.clj后,您必须从project.clj目录重新启动nrepl。有道理。谢谢你的提示! - Reb.Cabin
1
看起来当你改变project.clj时,不需要重启所有东西。只需nrepl-eval-buffer该文件,它就会被nrepl服务器知道。 - yeh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接