2014-04-21 14 views
5

Jestem bardzo nowy w Clojure i świetnie się z nim bawię. Jedną rzeczą, z którą mam problem jest to, jak czytać błędy, osobiście uważam, że nie są zbyt opisowe, ale to pewnie ze względu na moją "nową bierność".Brak implementacji metody:: make-reader protokołu: # 'clojure.java.io/IOFactory znaleziony dla klasy: zero

Na przykład, problem mam teraz jest, gdy próbuję uruchomić mój serwer dzwonka (mogę podać więcej szczegółów w razie potrzeby):

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 

Jest to więc dla mnie niejasne, w jaki sposób Wiem dokładnie, co zrobiłem źle? Nie pamiętam jak radzić sobie z jakimkolwiek "make-reader", protokołami czy IOFactory.

Odpowiedz

8

Jest to podchwytliwe pytanie wymagające odpowiedzi bez większego kontekstu. Wygląda jednak na to, że jesteś obrzydliwy w stosunku do http://dev.clojure.org/jira/browse/CLJ-1210, co oznacza, że ​​ten komunikat o błędzie jest zdecydowanie mało pomocny!

Proszę spojrzeć na numer Clojure Clostache error - No implementation of method: :make-reader of protocol: #'clojure.java.io/IOFactory found for class: nil, który może być duplikatem. Długi i krótki jest taki, że niektóre zasoby, o których mówisz, nie istnieją. W wyniku tego jest odzyskiwany jako "zero", co powoduje problemy, które widzisz. Być może przypadek, w którym biblioteka może rzucić wyjątek dla zasobu nieznajdującego (lub przynajmniej mającego wariant odrzucania wyjątków).

Jednym ze sposobów, w jaki się nad tym zastanawiałem, było przyjrzenie się kodowi źródłowemu selmerowi, ponieważ jest to pierwszy fragment śledzenia stosu, który nie jest clojure.core. Jedną z pierwszych rzeczy, to robi to ...

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

Stąd niektóre odliczenia i szybki bit googling mnie do powyższych.

[2017 Aktualizacja: nieprzydatny błąd został ostatecznie ustalony w Clojure 1.8, więc mam nadzieję, że ludzie nie będą już widzieć ten problem!]

+1

Dzięki wielkie! to zdecydowanie pomogło mi pójść we właściwym kierunku. Okazało się, że błędnie napisałem ścieżkę do pliku w jednym z html: {% extends "picture_gallery/views/template/base.html"%}, kiedy powinien to być "szablon". Zastanawiam się, czy ten problem CLJ-1210 dotyczy najnowszej wersji Clojure. –

+0

Wygląda na to, że jest dołączona łatka, więc może to zrobić 1.7.0. – pete23

+1

@GustavoMatias Wielkie dzięki za tę podpowiedź. Miał ten sam dziwny błąd, który był oczywiście spowodowany niewłaściwą strukturą projektu w moim folderze zasobów. – tareq