Clojure и Compojure: Карта ответов равна нулю - PullRequest
0 голосов
/ 30 марта 2019

Я использую compojure для базового веб-приложения, у меня есть этот код в core.clj:

(defroutes routes
      (GET "/" [] (layout/application "Home" (contents/index)))
      (route/resources "/"))

(def application (handler/site routes))

(defn -main []
  (let [port (Integer/parseInt (or (System/getenv "PORT") "8090"))]
    (jetty/run-jetty application {:port port :join? false})))

Когда я получаю доступ к 0.0.0.0:8090, все загружается нормально, но я продолжаю видеть эту ошибку:

java.lang.NullPointerException: Response map is nil
    at ring.util.servlet$update_servlet_response.invokeStatic(servlet.clj:100)
    at ring.util.servlet$update_servlet_response.invoke(servlet.clj:91)
    at ring.util.servlet$update_servlet_response.invokeStatic(servlet.clj:95)
    at ring.util.servlet$update_servlet_response.invoke(servlet.clj:91)
    at ring.adapter.jetty$proxy_handler$fn__337.invoke(jetty.clj:27)
    at ring.adapter.jetty.proxy$org.eclipse.jetty.server.handler.AbstractHandler$ff19274a.handle(Unknown Source)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
    at org.eclipse.jetty.server.Server.handle(Server.java:503)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:364)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:260)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305)
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
    at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:118)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126)
    at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:765)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:683)
    at java.base/java.lang.Thread.run(Thread.java:844)

Есть идеи, что происходит?

1 Ответ

1 голос
/ 30 марта 2019

@ Сванте почти наверняка прав.Простой способ проверить это - использовать функцию spyx из библиотеки Tupelo :

(ns demo.core
  (:use tupelo.core))

(defroutes routes
  (GET "/" [] (spyx (layout/application "Home" (contents/index))))
  (route/resources "/"))

, которая будет печатать что-то вроде:

(layout/application "Home" (contents/index))) => nil 

при запуске,spyx («явный шпион») печатает заданное вами выражение, стрелку и значение выражения.spy, spyx, spy-pretty и т. Д. также возвращают напечатанное значение (в отличие от println, которое всегда возвращает nil), поэтому вы можете вставить spyраспечатка в любом месте без нарушения цепочки обработки.Таким образом, вам не нужно писать что-то вроде:

(defroutes routes
  (GET "/" [] (let [tmp-1 (layout/application "Home" (contents/index))]
                (println "layout/application result => " tmp-1)
                tmp-1)))
  (route/resources "/"))

, чтобы напечатать отладочное сообщение.Чтобы spy & друзья, добавьте это к :dependencies в вашем project.clj:

[tupelo "0.9.138"]

Обновление

Хмммм .... Не уверен, что могбыть проблемой.Я сделал простое демонстрационное приложение из lein new compojure demo-compojure со следующим:

(ns demo-compojure.handler
  (:use tupelo.core)
  (:require [compojure.core :refer :all]
            [compojure.route :as route]
            [ring.middleware.defaults :refer [wrap-defaults site-defaults]]))

(defn index []
  (spy :index--result "Hello World"))

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

(def app
  (wrap-defaults app-routes site-defaults))

и результатами:

~/expr/demo-compojure > lein ring server
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Started server on port 3000
:index--result => "Hello World"
(index) => "Hello World"

Так что это работает.Кроме того, int? является базовой функцией Clojure, так что это озадачивает.Возможно, создать чистый демо-проект, подобный приведенному выше, и взять его оттуда?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...