用Clojure编写REST service 三 返回JSON

前面的REST API还要继续改进,因为Ajax调用通常都需要JSON格式的响应,所以修改test.clj文件如下:

(ns my-website.rest.test
  (:require [noir.response :as response])
  (:use [noir.core :only [defpage]]))

(defpage "/rest/:id" {:keys [id]} (response/json {:userId id}))

:require 引入了noir.response, 并且使用response作为别名。

这样在defpage的最后引入了response/json 来生成json格式的http响应。

参考API文档:http://www.webnoir.org/autodoc/1.3.0/noir.response.html#var-json

json
(json content)
Wraps the response in the json content type and generates JSON from the content

浏览器上显示的数据为:

{"userId":"freebird"}
并且Chrome中跟踪可以看到Type为application/json

如果这时候关闭应用程序,以后再使用lein run的时候,会看到异常信息:

~/my-website$ lein run
Exception in thread "main" java.lang.ExceptionInInitializerError
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:247)
	at clojure.lang.RT.loadClassForName(RT.java:2056)
	at clojure.lang.RT.load(RT.java:419)
	at clojure.lang.RT.load(RT.java:400)
	at clojure.core$load$fn__4890.invoke(core.clj:5415)
	at clojure.core$load.doInvoke(core.clj:5414)
	at clojure.lang.RestFn.invoke(RestFn.java:408)
	at clojure.core$load_one.invoke(core.clj:5227)
	at clojure.core$load_lib.doInvoke(core.clj:5264)
	at clojure.lang.RestFn.applyTo(RestFn.java:142)
	at clojure.core$apply.invoke(core.clj:603)
	at clojure.core$load_libs.doInvoke(core.clj:5298)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at clojure.core$apply.invoke(core.clj:605)
	at clojure.core$use.doInvoke(core.clj:5392)
	at clojure.lang.RestFn.invoke(RestFn.java:436)
	at cheshire.core$loading__4784__auto__.invoke(core.clj:1)
	at cheshire.core__init.load(Unknown Source)
	at cheshire.core__init.<clinit>(Unknown Source)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:247)
	at clojure.lang.RT.loadClassForName(RT.java:2056)
	at clojure.lang.RT.load(RT.java:419)
	at clojure.lang.RT.load(RT.java:400)
	at clojure.core$load$fn__4890.invoke(core.clj:5415)
	at clojure.core$load.doInvoke(core.clj:5414)
	at clojure.lang.RestFn.invoke(RestFn.java:408)
	at clojure.core$load_one.invoke(core.clj:5227)
	at clojure.core$load_lib.doInvoke(core.clj:5264)
	at clojure.lang.RestFn.applyTo(RestFn.java:142)
	at clojure.core$apply.invoke(core.clj:603)
	at clojure.core$load_libs.doInvoke(core.clj:5298)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at clojure.core$apply.invoke(core.clj:603)
	at clojure.core$require.doInvoke(core.clj:5381)
	at clojure.lang.RestFn.invoke(RestFn.java:421)
	at noir.response$loading__4784__auto__.invoke(response.clj:1)
	at noir.response__init.load(Unknown Source)
	at noir.response__init.<clinit>(Unknown Source)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:247)
	at clojure.lang.RT.loadClassForName(RT.java:2056)
	at clojure.lang.RT.load(RT.java:419)
	at clojure.lang.RT.load(RT.java:400)
	at clojure.core$load$fn__4890.invoke(core.clj:5415)
	at clojure.core$load.doInvoke(core.clj:5414)
	at clojure.lang.RestFn.invoke(RestFn.java:408)
	at clojure.core$load_one.invoke(core.clj:5227)
	at clojure.core$load_lib.doInvoke(core.clj:5264)
	at clojure.lang.RestFn.applyTo(RestFn.java:142)
	at clojure.core$apply.invoke(core.clj:603)
	at clojure.core$load_libs.doInvoke(core.clj:5298)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at clojure.core$apply.invoke(core.clj:603)
	at clojure.core$require.doInvoke(core.clj:5381)
	at clojure.lang.RestFn.invoke(RestFn.java:408)
	at my_website.rest.test$loading__4784__auto__.invoke(test.clj:1)
	at my_website.rest.test__init.load(Unknown Source)
	at my_website.rest.test__init.<clinit>(Unknown Source)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:247)
	at clojure.lang.RT.loadClassForName(RT.java:2056)
	at clojure.lang.RT.load(RT.java:419)
	at clojure.lang.RT.load(RT.java:400)
	at clojure.core$load$fn__4890.invoke(core.clj:5415)
	at clojure.core$load.doInvoke(core.clj:5414)
	at clojure.lang.RestFn.invoke(RestFn.java:408)
	at clojure.core$load_one.invoke(core.clj:5227)
	at clojure.core$load_lib.doInvoke(core.clj:5264)
	at clojure.lang.RestFn.applyTo(RestFn.java:142)
	at clojure.core$apply.invoke(core.clj:603)
	at clojure.core$load_libs.doInvoke(core.clj:5298)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at clojure.core$apply.invoke(core.clj:603)
	at clojure.core$require.doInvoke(core.clj:5381)
	at clojure.lang.RestFn.invoke(RestFn.java:408)
	at noir.server$load_views_ns.doInvoke(server.clj:37)
	at clojure.lang.RestFn.invoke(RestFn.java:408)
	at my_website.server__init.load(Unknown Source)
	at my_website.server__init.<clinit>(Unknown Source)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:247)
	at clojure.lang.RT.loadClassForName(RT.java:2056)
	at clojure.lang.RT.load(RT.java:419)
	at clojure.lang.RT.load(RT.java:400)
	at clojure.core$load$fn__4890.invoke(core.clj:5415)
	at clojure.core$load.doInvoke(core.clj:5414)
	at clojure.lang.RestFn.invoke(RestFn.java:408)
	at clojure.core$load_one.invoke(core.clj:5227)
	at clojure.core$load_lib.doInvoke(core.clj:5264)
	at clojure.lang.RestFn.applyTo(RestFn.java:142)
	at clojure.core$apply.invoke(core.clj:603)
	at clojure.core$load_libs.doInvoke(core.clj:5298)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at clojure.core$apply.invoke(core.clj:603)
	at clojure.core$require.doInvoke(core.clj:5381)
	at clojure.lang.RestFn.invoke(RestFn.java:408)
	at user$eval1.invoke(NO_SOURCE_FILE:1)
	at clojure.lang.Compiler.eval(Compiler.java:6511)
	at clojure.lang.Compiler.eval(Compiler.java:6500)
	at clojure.lang.Compiler.eval(Compiler.java:6477)
	at clojure.core$eval.invoke(core.clj:2797)
	at clojure.main$eval_opt.invoke(main.clj:297)
	at clojure.main$initialize.invoke(main.clj:316)
	at clojure.main$null_opt.invoke(main.clj:349)
	at clojure.main$main.doInvoke(main.clj:427)
	at clojure.lang.RestFn.invoke(RestFn.java:421)
	at clojure.lang.Var.invoke(Var.java:419)
	at clojure.lang.AFn.applyToHelper(AFn.java:163)
	at clojure.lang.Var.applyTo(Var.java:532)
	at clojure.main.main(main.java:37)
Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.core.JsonFactory
	at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:169)
	at cheshire.factory__init.__init0(Unknown Source)
	at cheshire.factory__init.<clinit>(Unknown Source)
不清楚lein内部的机制。但是有个办法可以解决。首先运行lein clean 清理工程。

再次运行lein run,会重新编译整个工程。然后一切就好了。

你可能感兴趣的:(用Clojure编写REST service 三 返回JSON)