Нет реализации метода: :make-reader протокола: #'clojure.java.io/IOFactory для класса: nil

Я очень новичок в Clojure, и я прекрасно провожу время, играя с ним. Одна вещь, с которой у меня возникли проблемы, это то, как читать ошибки, я лично думаю, что они не очень описательные, но это, вероятно, из-за моего «новичка».

Например, проблема, с которой я сталкиваюсь сейчас, заключается в том, что я пытаюсь запустить свой кольцевой сервер (при необходимости я могу предоставить более подробную информацию):

Started server on port 3000
java.lang.IllegalArgumentException: No implementation of method: :make-reader of protocol: #'clojure.java.io/IOFactory found for class: nil
          core_deftype.clj:544 clojure.core/-cache-protocol-fn
                     io.clj:69 clojure.java.io/fn[fn]
                    io.clj:102 clojure.java.io/reader
               RestFn.java:410 clojure.lang.RestFn.invoke
             validator.clj:161 selmer.validator/validate-tags
             validator.clj:175 selmer.validator/validate
       template_parser.clj:155 selmer.template-parser/read-template
       template_parser.clj:206 selmer.template-parser/preprocess-template
               RestFn.java:410 clojure.lang.RestFn.invoke
                parser.clj:211 selmer.parser/parse-file
                parser.clj:234 selmer.parser/parse
               RestFn.java:442 clojure.lang.RestFn.invoke
                 parser.clj:99 selmer.parser/render-file
               RestFn.java:425 clojure.lang.RestFn.invoke
                 layout.clj:17 picture-gallery.views.layout/picture-gallery.views.layout.RenderablePage
                   core.clj:94 compojure.core/make-route[fn]
                   core.clj:40 compojure.core/if-route[fn]
                   core.clj:25 compojure.core/if-method[fn]
                  core.clj:107 compojure.core/routing[fn]
                 core.clj:2515 clojure.core/some
                  core.clj:107 compojure.core/routing
               RestFn.java:139 clojure.lang.RestFn.applyTo
                  core.clj:626 clojure.core/apply
                  core.clj:112 compojure.core/routes[fn]
                  core.clj:107 compojure.core/routing[fn]
                 core.clj:2515 clojure.core/some
                  core.clj:107 compojure.core/routing
               RestFn.java:139 clojure.lang.RestFn.applyTo
                  core.clj:626 clojure.core/apply
                  core.clj:112 compojure.core/routes[fn]
             middleware.clj:44 noir.util.middleware/wrap-request-map[fn]
         keyword_params.clj:32 ring.middleware.keyword-params/wrap-keyword-params[fn]
          nested_params.clj:70 ring.middleware.nested-params/wrap-nested-params[fn]
                 params.clj:58 ring.middleware.params/wrap-params[fn]
             middleware.clj:12 hiccup.middleware/wrap-base-url[fn]
      multipart_params.clj:107 ring.middleware.multipart-params/wrap-multipart-params[fn]
            middleware.clj:139 noir.util.middleware/wrap-access-rules[fn]
            validation.clj:135 noir.validation/wrap-noir-validation[fn]
                cookies.clj:66 noir.cookies/noir-cookies[fn]
               cookies.clj:171 ring.middleware.cookies/wrap-cookies[fn]
               session.clj:141 noir.session/noir-flash[fn]
                  flash.clj:31 ring.middleware.flash/wrap-flash[fn]
                session.clj:96 noir.session/noir-session[fn]
                session.clj:85 ring.middleware.session/wrap-session[fn]
                  Var.java:379 clojure.lang.Var.invoke
                 reload.clj:18 ring.middleware.reload/wrap-reload[fn]
             stacktrace.clj:17 ring.middleware.stacktrace/wrap-stacktrace-log[fn]
             stacktrace.clj:80 ring.middleware.stacktrace/wrap-stacktrace-web[fn]
                  jetty.clj:18 ring.adapter.jetty/proxy-handler[fn]
              (Unknown Source) ring.adapter.jetty.proxy$org.eclipse.jetty.server.handler.AbstractHandler$ff19274a.handle
       HandlerWrapper.java:116 org.eclipse.jetty.server.handler.HandlerWrapper.handle
               Server.java:363 org.eclipse.jetty.server.Server.handle
   AbstractHttpConnection.java:483 org.eclipse.jetty.server.AbstractHttpConnection.handleRequest
   AbstractHttpConnection.java:920 org.eclipse.jetty.server.AbstractHttpConnection.headerComplete
   AbstractHttpConnection.java:982 org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete
           HttpParser.java:635 org.eclipse.jetty.http.HttpParser.parseNext
           HttpParser.java:235 org.eclipse.jetty.http.HttpParser.parseAvailable
   AsyncHttpConnection.java:82 org.eclipse.jetty.server.AsyncHttpConnection.handle
SelectChannelEndPoint.java:628 org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle
 SelectChannelEndPoint.java:52 org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run
     QueuedThreadPool.java:608 org.eclipse.jetty.util.thread.QueuedThreadPool.runJob
     QueuedThreadPool.java:543 org.eclipse.jetty.util.thread.QueuedThreadPool$3.run
               Thread.java:722 java.lang.Thread.run

Это настолько неясно для меня, как я точно узнаю, что я сделал неправильно? Я не помню, чтобы имел дело с каким-либо "созданием-читателем", протоколами или IOFactory.


person Gustavo Matias    schedule 21.04.2014    source источник


Ответы (1)


Это сложный вопрос, на который невозможно ответить без особого контекста. Однако вы, похоже, нарушаете http://dev.clojure.org/jira/browse/CLJ-1210, который указывает на то, что это сообщение об ошибке явно бесполезно!

Пожалуйста, посмотрите на Clojure Clostache error - Нет реализация метода: :make-reader протокола: #'clojure.java.io/IOFactory найдено для класса: nil, который вполне может быть дубликатом. Суть в том, что какого-то ресурса, на который вы ссылаетесь, не существует. В результате он извлекается как «ноль», что приводит к проблемам, которые вы видите. Возможно, это случай, когда библиотека может генерировать исключение для ненайденного ресурса (или, по крайней мере, иметь вариант генерирования исключения).

Один из способов, которым я копался в этом, заключался в просмотре исходного кода selmer, так как это первая часть трассировки стека, не относящаяся к clojure.core. Одна из первых вещей, которые это делает, это...

(defn validate-tags [template]
    (with-open [rdr (reader template)]

Отсюда некоторые выводы и быстрое гугление привели меня к вышеизложенному.

[Обновление 2017 года: бесполезная ошибка была исправлена ​​в Clojure 1.8, так что, надеюсь, люди больше не увидят эту проблему!]

person pete23    schedule 21.04.2014
comment
Большое спасибо! это определенно помогло мне пойти в правильном направлении. оказалось, что я неправильно написал путь к файлу в одном из моих html: {% extends picture_gallery/views/template/base.html %}, хотя на самом деле это должны быть шаблоны. Интересно, относится ли эта проблема CLJ-1210 к самой последней версии Clojure. - person Gustavo Matias; 22.04.2014
comment
Похоже, есть патч, так что вполне может получиться 1.7.0. - person pete23; 23.04.2014
comment
@GustavoMatias Большое спасибо за эту подсказку. Была такая же странная ошибка, которая, очевидно, была связана с неправильной структурой проекта в моей папке ресурсов. - person ulrich; 02.02.2017