获取" java.lang.Exception:无法识别的body"在heroku上使用ring-json的时候

时间:2016-08-02 11:20:42

标签: json heroku clojure ring

我使用ring-json将json数据传递到前端,该前端使用试剂渲染一些d3图表。我已经让这个简单的项目在本地工作,但当我将它部署到heroku时,我收到了以下错误(来自heroku日志):

2016-08-01T15:50:38.955857+00:00 app[web.1]: java.lang.Exception: Unrecognized body: [{:key "GB", :values [{:y 2.4555984, :x 2002} {:y 2.519768, :x 2004} {:y 2.4532163, :x 2006} {:y 2.420068, :x 2008} {:y 2.464492, :x 2010} {:y 2.321085, :x 2012}]} {:key "ES", :values [{:y 2.2434933, :x 2002} {:y 2.34095, :x 2004} {:y 2.1764393, :x 2006} {:y 2.0458074, :x 2008} {:y 2.1055703, :x 2010} {:y 2.041821, :x 2012}]} {:key "DE", :values [{:y 2.3088598, :x 2002} {:y 2.3240418, :x 2004} {:y 2.414952, :x 2006} {:y 2.2453654, :x 2008} {:y 2.2269878, :x 2010} {:y 2.1301556, :x 2012}]} {:key "FR", :values [{:y 2.292432, :x 2002} {:y 2.6937985, :x 2004} {:y 2.2779455, :x 2006} {:y 2.3077664, :x 2008} {:y 2.390625, :x 2010} {:y 2.3109756, :x 2012}]} {:key "HU", :values [{:y 2.5220544, :x 2002} {:y 2.570761, :x 2004} {:y 2.7397892, :x 2006} {:y 3.0420985, :x 2008} {:y 2.8456118, :x 2010} {:y 2.5978153, :x 2012}]} {:key "FI", :values [{:y 2.3738055, :x 2002} {:y 2.4264107, :x 2004} {:y 3.1687763, :x 2006} {:y 3.2200456, :x 2008} {:y 3.2385516, :x 2010} {:y 2.240783, :x 2012}]} {:key "PT", :values [{:y 2.8570483, :x 2002} {:y 2.8615985, :x 2004} {:y 2.649865, :x 2006} {:y 2.7748206, :x 2008} {:y 2.8316278, :x 2010} {:y 2.8707578, :x 2012}]} {:key "SE", :values [{:y 2.7565827, :x 2002} {:y 2.7382352, :x 2004} {:y 3.7057602, :x 2006} {:y 3.5786886, :x 2008} {:y 2.478958, :x 2010} {:y 2.2799134, :x 2012}]}]
2016-08-01T15:50:38.955860+00:00 app[web.1]:    at ring.util.servlet$update_servlet_response.invokeStatic(servlet.clj:115)
2016-08-01T15:50:38.955859+00:00 app[web.1]:    at ring.util.servlet$set_body.invoke(servlet.clj:84)
2016-08-01T15:50:38.955861+00:00 app[web.1]:    at ring.adapter.jetty$proxy_handler$fn__3274.invoke(jetty.clj:26)
2016-08-01T15:50:38.955861+00:00 app[web.1]:    at ring.util.servlet$update_servlet_response.invoke(servlet.clj:107)
2016-08-01T15:50:38.955863+00:00 app[web.1]:    at ring.adapter.jetty.proxy$org.eclipse.jetty.server.handler.AbstractHandler$ff19274a.handle(Unknown Source)
2016-08-01T15:50:38.955865+00:00 app[web.1]:    at org.eclipse.jetty.server.Server.handle(Server.java:497)
2016-08-01T15:50:38.955858+00:00 app[web.1]:    at ring.util.servlet$set_body.invokeStatic(servlet.clj:105)
2016-08-01T15:50:38.955864+00:00 app[web.1]:    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
2016-08-01T15:50:38.955867+00:00 app[web.1]:    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
2016-08-01T15:50:38.955869+00:00 app[web.1]:    at java.lang.Thread.run(Thread.java:745)
2016-08-01T15:50:38.955866+00:00 app[web.1]:    at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540)
2016-08-01T15:50:38.955868+00:00 app[web.1]:    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
2016-08-01T15:50:38.955866+00:00 app[web.1]:    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257)
2016-08-01T15:50:38.955865+00:00 app[web.1]:    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310)

我不确定从哪里开始。我也不确定ring-json是个问题。我是否需要在某处设置标题?

非常感谢任何帮助。暂时,这是一个在heroku上运行的项目的链接:https://esd-viz.herokuapp.com/。项目本身可以在http://github.com/ezmiller/esd-viz找到。

1 个答案:

答案 0 :(得分:4)

lein uberjar
heroku local web

从Procfile运行堆栈,这将是在本地测试事物的最佳方式。 (默认情况下,端口5000上的主机)。这为我重现了这个问题。

关于原因......问题在于:

33 (def load-data
34   {:status 200
35    :body (essdata/get-json-data)})

您要返回的正文是一个向量,除非您有中间件来处理它,否则它无效。那么ring-defaults设置正确吗?

如果你比较:

env/dev/clj/esd_viz/middleware.clj
env/prod/clj/esd_viz/middleware.clj

你可以在dev中看到你有JSON中间件,但不是prod。

因此,当使用prod配置文件运行时,矢量不会像在dev中一样转换为JSON。