Fork me on GitHub
#ring-swagger
<
2019-02-21
>
salokristian12:02:03

I'm having trouble getting spec working with compojure-api. I have version "2.0.0-alpha28" of compojure-api installed. The validation is working fine with Schema, but when I change :coercion :spec to one endpoint for testing spec, the following error is thrown:

Caused by: java.lang.IllegalArgumentException: No implementation of method: :specify of protocol: #'compojure.api.coercion.spec/Specify found for class: nil
	at clojure.core$_cache_protocol_fn.invokeStatic(core_deftype.clj:583)
	at clojure.core$_cache_protocol_fn.invoke(core_deftype.clj:575)
	at compojure.api.coercion.spec$eval19818$fn__19819$G__19809__19826.invoke(spec.clj:37)
	at compojure.api.coercion.spec$fn__19877.invokeStatic(spec.clj:78)
	at compojure.api.coercion.spec$fn__19877.invoke(spec.clj:78)
The code that is causing this error is:
(ns musician.instrument.api
  (:require [compojure.api.sweet :as api]
            [musician.instrument.db :as db]
            [ring.util.http-response :as res]
            [clojure.spec.alpha :as s]))

(s/def ::instruments (s/coll-of string?))

(api/defroutes routes
  (api/GET "/" {user-id :identity}
    :coercion :spec
    :summary "Get all user's instruments"
    :return ::instruments
    (res/ok (db/find-instruments-of-user {:user-id user-id}))))
What am I missing here?

dtsiedel16:02:16

Not sure if this is the problem you're facing but I've only seen the spec coercion applied to an entire context (like in https://github.com/metosin/compojure-api/blob/master/examples/coercion/src/example/spec.clj)

dtsiedel16:02:44

Is there documentation somewhere that says it's valid to apply to only a single route?